2014-10-03 2 views
1

통신 포트에 연결된 주변 장치와 통신하기 위해이 파스칼 코드를 C#으로 변환하려고합니다. 이 코드 조각은 컨트롤 바이트를 계산해야하지만 올바른 16 진수 값을 얻지 못합니다. 따라서 올바른 방법으로 코드를 변환하는지 궁금합니다. 파스칼 :파스칼에서 C#으로 변환

begin 
    check := 255; 
    for i:= 3 to length(sequence)-4 do 
    check := check xor byte(sequence[i]); 
end; 

C 번호 :

int check = 255; 
for (int x = 3; x < (sequence.Length - 4); x++) 
{ 
    check = check^(byte)(sequence[x]); 
} 

파스칼 기능 :

{ *** conversion of number into string ‘hex’ *** } 
function word_to_hex (w: word) : string; 
    var 
    i : integer; 
    s : string; 
    b : byte; 
    c : char; 
begin 
    s := ‘’; 
    for i:= 0 to 3 do 
    begin 
    b := (hi(w) shr 4) and 15; 
    case b of 
    0..9 : c := char(b+$30); 
    10..15 : c := char(b+$41-10); 
    end; 
    s := s + c; 
    w := w shl 4; 
end; 
word_ to_hex := s; 
end; 

C# 1 환산 :

 public string ControlByte(string check) 
    { 
     string s = ""; 
     byte b; 
     char c = '\0'; 
     //shift = check >> 4 & 15; 
     for (int x = 0; x <= 3; x++) 
     { 
      b = (byte)((Convert.ToInt32(check) >> 4) & 15); 

      if (b >= 0 && b <= 9) 
      { 
       c = (char)(b + 0x30); 
      } 
      else if (b >= 10 && b <= 15) 
      { 
       c = (char)(b + 0x41 - 10); 
      } 
      s = s + c; 
      check = (Convert.ToInt32(check) << 4).ToString(); 
     } 
     return s; 
    } 

마지막 파스칼 :

,
function byte_to_hex (b:byte) : string; 
begin 
byte_to_hex := copy(word_to_hex(word(b)),3,2); 
end; 

나는 어떤 방법으로 함수의 결과를 부분 문자열로 처리하는지 모르겠습니다. 따라서 코드 변환에 문제가 있는지 여부와 함수 결과를 바이트로 변환해야하는지 여부를 알려주십시오. 도와 주셔서 감사합니다, University of Florida.

추가 정보 EDIT : 처음에는 프린터가 인쇄해야하는 명령과 정보가 포함 된 문자열 시퀀스를 보냅니다. 모든 시퀀스에는 고유 한 제어 바이트 (16 진수)가 있기 때문에 시퀀스 (시퀀스 = "P1; 1 $ l201PrinterPrinterPrinter1B/100.00/100.00/0/\")에서 이것을 계산해야합니다. POSNET => "cc - PASCAL 언어의 다음 알고리즘에 따라 (첫 번째 코드 블록 참조). => 1에 따라 2 HEX 숫자 (ESC P 다음에이 문자를 # 255 초기 수량으로 EXOR)로 인코딩 된 제어 바이트입니다. 제어 바이트를 구성하는 위의 루프에서 계산 된 검사 번호는 두 개의 HEX 문자 (범위 : '0'.. '9', 'A'.. 'F', 'a'.. 'f'), 다음 byte_to_hex 함수를 사용합니다 (세 번째 코드 블록 참조). => {* 바이트를 2 문자로 변환 *} (5 번째 코드 블록 참조)

+3

데이터 유형이 무엇인지 알려주지 않습니다. 우리는 파스칼 배열이 0인지 1인지를 전혀 모릅니다. 그리고 당신이 사용하는 입력 데이터가 무엇인지 알려주지 않습니다. 당신이 얻는 결과물도 없습니다. 디버깅을 고려해 보셨습니까? 그것은 당신이 정말로 습득해야하는 핵심 기술입니다. IDE 디버거를 사용하거나 추적 디버깅을 추가하십시오. 프로그램이 서로 갈라지는 곳에서 운동하십시오. 그런 다음 문제를 해결하십시오. 프로그램이 같은 방식으로 작동 할 때까지 반복하십시오. –

+0

또한 16 진수 문자열로 변환하는 두 함수는 모두 가짜입니다. 이를 수행하는 더 간단한 방법이 있으며 적어도 파스칼에 대해서는 라이브러리 기능이 있습니다. –

+0

빠른 답장을 보내 주신 David 께 감사드립니다. 루프의 '시퀀스'는 문자열 '1; 1 $ l201PrinterPrinterPrinter1B/100.00/100.00/0 /'이고 '확인'은 문자열로 변환되어 16 진수 값을 반환하는 'ControlByte'함수에 매개 변수로 전달됩니다. 멀리 스퓨리어스에 관한 한, 열 프린터에 대한 Posnet 매뉴얼 형식의 파스칼 코드가 있습니다. 이 정보가 문제를 이해하는 데 도움이되기를 바랍니다. – user1961008

답변

1

내가 볼 수있는 가장 명백한 문제는 파스칼 코드가 1- 기반 8 비트 인코딩 된 문자열에서 작동하고 C# 코드는 0부터 시작하는 16 비트 인코딩 문자열에서 작동합니다. 사용하는 Pascal/Delphi 코드를 C#으로 변환하려면 잘못 일치해야합니다. 아마도 다음과 같은 :

자,이 쓰기 위해 나는 꽤 많은 가정을 했어
byte[] bytes = Encoding.Default.GetBytes(sequence); 
int check = 255; 
for (int i = 2; i < bytes.Length-4; i++) 
{ 
    check ^= bytes[i]; 
} 

, 어디서든 질문에 충분한 코드 근처에 포함되지 않았기 때문이다. 여기서 I는 가정 무엇 :

  1. 파스칼 sequence 변수 ANSI 델파이 AnsiString 부호화 1 계 8 비트이다.
  2. 변수는 델파이 32 비트 Integer으로되어 있습니다.
  3. 변수 C# 입니다.

이러한 가정 중 하나라도 틀린 것이라면 위의 코드는 좋지 않을 것입니다. 예를 들어, 아마도 파스칼 check은 실제로 Byte입니다. 어떤 경우에는 C# 코드가 다음과 같아야합니다.

byte[] bytes = Encoding.Default.GetBytes(sequence); 
byte check = 255; 
for (int i = 2; i < bytes.Length - 4; i++) 
{ 
    check ^= bytes[i]; 
} 

완전한 정보를 제공하는 것이 중요하다는 사실을 알리시기 바랍니다.

정말이 질문의 모든 것입니다. 나머지 코드는 값을 C# 코드의 16 진수 문자열로 변환하는 것과 관련이 있습니다. 스택 오버플로에 대해서는 여기에서 여러 번 다룹니다. 예를 들어 :

많은 더 많은 같은 질문이 있습니다.

+0

David, 인코딩 유형을 확인해 드리겠습니다. 이 질문에서 벗어나고 싶었던 것은 내가 파스칼을 C#으로 올바르게 변환하는지 알기 위해서입니다. 왜냐하면이 언어를 다루는 것은 이번이 처음이기 때문입니다. – user1961008

+0

David, Ansi는 C#에서는 작동하지 않지만 Default는 나에게 'check'변수에 대해 이전과 같은 결과를 제공합니다. 그러나, 내 가정은 파스칼에서 word_to_hex 함수와 C#에서 ControlByte 함수는 동일하지 않으며 문제가 있다는 것입니다. – user1961008

+0

'ControlByte'는 분명히'word_to_hex'와 같지 않습니다. 전자는 문자열을 사용하고 후자는 16 비트 부호없는 정수인'Word'를 사용합니다. C#에서는'word_to_hex '전체가'val.ToString ("X4")'val'이'ushort'로 쓰여질 수 있습니다. 델파이에서는'IntToHex (val, 4) '라고 쓰여질 것입니다. 모든 16 진수 변환 코드는 가짜입니다. 내 대답의 끝에서 링크를 읽는 것이 좋습니다. –

관련 문제