통신 포트에 연결된 주변 장치와 통신하기 위해이 파스칼 코드를 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 번째 코드 블록 참조)
데이터 유형이 무엇인지 알려주지 않습니다. 우리는 파스칼 배열이 0인지 1인지를 전혀 모릅니다. 그리고 당신이 사용하는 입력 데이터가 무엇인지 알려주지 않습니다. 당신이 얻는 결과물도 없습니다. 디버깅을 고려해 보셨습니까? 그것은 당신이 정말로 습득해야하는 핵심 기술입니다. IDE 디버거를 사용하거나 추적 디버깅을 추가하십시오. 프로그램이 서로 갈라지는 곳에서 운동하십시오. 그런 다음 문제를 해결하십시오. 프로그램이 같은 방식으로 작동 할 때까지 반복하십시오. –
또한 16 진수 문자열로 변환하는 두 함수는 모두 가짜입니다. 이를 수행하는 더 간단한 방법이 있으며 적어도 파스칼에 대해서는 라이브러리 기능이 있습니다. –
빠른 답장을 보내 주신 David 께 감사드립니다. 루프의 '시퀀스'는 문자열 '1; 1 $ l201PrinterPrinterPrinter1B/100.00/100.00/0 /'이고 '확인'은 문자열로 변환되어 16 진수 값을 반환하는 'ControlByte'함수에 매개 변수로 전달됩니다. 멀리 스퓨리어스에 관한 한, 열 프린터에 대한 Posnet 매뉴얼 형식의 파스칼 코드가 있습니다. 이 정보가 문제를 이해하는 데 도움이되기를 바랍니다. – user1961008