У меня есть код C# ниже
public string CRCCalculator(string dtc)
{
ushort crc = 0x0000;
byte[] data = GetBytesFromHexString(dtc);
for (var pos = 0; pos < data.Length; pos++)
{
crc ^= data[pos];
for (var i = 8; i != 0; i--)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
crc >>= 1;
}
}
return crc.ToString("X4");
}
Но мне это нужно в vb.net, я лично пробовал его преобразовать, и в прошлом я преобразовал много кода C# в vb.net, однако я не работал с ushort'ами, битами и т. д.
Вот преобразованный код VB.net:
Public Shared Function CRCCalculator(dtc As String) As String
Dim crc As UShort = &H0
Dim data As Byte() = getBytesFromHexString(dtc)
Dim pos = 0
Do While (pos < data.Length)
crc ^= data(pos)
Dim i = 8
Do While (i <> 0)
i = (i - 1)
If (crc And &H1) <> 0 Then
crc >>= 1
crc ^= &HA001
Else
crc >>= 1
End If
Loop
pos = (pos + 1)
Loop
Return crc.ToString("X4")
End Function
Вместо того, чтобы вернуть значение, я всегда получаю 0.
Добавлен @ChetanRanpariya
А как насчет кода GetBytesFromHexString
Я знаю, что код из GetBytesFromHexString работает правильно. Я считаю, что это как-то связано с операторами ^ = и >> =
Не могли бы вы поделиться кодом getBytesFromHexString
, чтобы мы могли отлаживать код с нашей стороны с правильной логикой
Вы отлаживали код vb.net и пытались сравнить значения переменных с кодом C#? Какую разницу вы заметили?
Вы знаете, что решения могут иметь общие проекты на C# и VB, верно? Вы всегда можете просто создать это в dll набора инструментов и сохранить на C#.
Я не думаю, что "^" делает то, что вы думаете. Вместо этого используйте «Xor».
Справочник по оператору C# ^ - оператор исключающее ИЛИ Справочник оператора VB ^ - оператор степени / экспоненты
Можете ли вы поделиться тем, что вы преобразовали в vb.net, и рассказать нам, с какой проблемой вы столкнулись в этом?