Pascal到C#的转换

本文关键字:转换 Pascal | 更新日期: 2023-09-27 18:25:35

我正试图将此pascal代码转换为C#,以便与连接到通信端口的外围设备进行通信。这段代码应该计算控制字节,但我没有得到正确的十六进制值,因此我想知道我是否以正确的方式转换代码。Pascal:

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]);
}

Pascal函数:

{ *** 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;

我不确定它是如何从函数中减去结果的。因此,请让我知道代码转换是否有问题,以及是否需要将函数结果转换为字节。感谢你的帮助,佛罗里达大学。

进一步信息编辑:最初我发送一个字符串序列,其中包含打印机应该打印的命令和信息。由于每个序列都有一个唯一的控制字节(以十六进制表示),我必须根据序列(sequence="P1;1$l201PrinterPrinter1B/100.00/100.00/0/''")进行计算,这是上码根据POSNET=>"cc–控制字节,编码为2个十六进制数字(ESC P之后的所有字符与该字节的EXOR,初始数量为#255),根据PASCAL语言中的以下算法:(参见第一个代码块)".=>1。在构成控制字节的上述循环中计算的校验数应使用以下byte_to_HEX函数重新编码为两个HEX字符(作用域中的ASCII字符:'0'..'9'、'A'..'F'、'A'..'F'):(请参见第三个代码块)。=>{*将字节转换为2个字符*}(请参阅第5个代码块)

Pascal到C#的转换

我能看到的最明显的问题是Pascal代码操作基于1的8位编码字符串,而C#代码操作基于0的16位编码字符串。要将您使用的Pascal/DDelphi代码转换为C#,您需要解决不匹配的问题。也许是这样的:

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

现在,为了写这篇文章,我不得不做出一些假设,因为你在这个问题中没有包含足够的代码。以下是我的假设:

  1. Pascal sequence变量是基于1的8位ANSI编码的Delphi AnsiString
  2. Pascal check变量是一个Delphi 32位带符号的Integer
  3. C#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上被一次又一次地报道了。例如:

  • C#将整数转换为十六进制并返回
  • 如何将字节数组转换为十六进制字符串,反之亦然

这样的问题还有很多。