[英]Pascal to C# conversion
我正在尝试将此Pascal代码转换为C#,以便与连接到comm端口的外围设备进行通信。 这段代码应该计算出控制字节,但是我没有得到正确的十六进制值,因此我想知道是否要以正确的方式转换代码。 帕斯卡尔:
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#:
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;
我不确定如何将函数的结果字符串化。 因此,请让我知道代码转换是否存在问题以及是否需要将函数结果转换为字节。 UF,我感谢您的帮助。
进一步的信息编辑:最初,我发送一个字符串序列,其中包含命令和打印机应该打印的信息。 由于每个序列都有一个唯一的控制字节(十六进制),因此我必须根据序列(序列=“ P1; 1 $ l201PrinterPrinterPrinter1B / 100.00 / 100.00 / 0 / \\”)进行计算,这就是上层代码根据POSNET => “ cc –控制字节,根据PASCAL语言的以下算法,编码为2个十六进制数字(将ESC P后的所有字符对这个字节进行EXOR运算,起始编号为#255):(请参见第一个代码块)” => 1。 在上述循环中计算出的构成控制字节的校验码应重新编码为两个十六进制字符(范围为ASCII字符:'0'..'9','A'..'F','a'..'f' ),使用以下byte_to_hex函数:(请参见第三个代码块)。 => { *将字节转换为2个字符* }(请参见第5个代码块)
我看到的最明显的问题是Pascal代码对基于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];
}
现在,为了写这篇文章,我不得不做很多假设,因为您没有在问题中包含足够多的代码。 这是我的假设:
sequence
变量是基于1的8位ANSI编码的Delphi AnsiString
。 check
变量是一个Delphi 32位有符号Integer
。 sequence
变量是C# string
。 如果这些假设中的任何一个被证明是错误的,那么上面的代码将是不好的。 例如,也许Pascal 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#代码中将值转换为十六进制字符串。 在Stack Overflow上一次又一次地谈到了这一点。 例如:
这样的问题还有很多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.