[英]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.