计算十六进制校验和的程序逻辑?
Program logic to calculate hexacode checksum?
我有一个十六进制代码,我必须为其执行校验和逻辑,这将给我一个校验和,该校验和将添加到 Hexacode 消息的末尾并传递给接收 TCP 服务器,然后,消息 I从服务器接收的需要通过执行校验和逻辑来检查
例如:我有一个 07040A13 的十六进制代码,其校验和值为 58,添加并作为 07040A1358 传递。在接收时,我得到 25000A01F0FFFFFFFF,校验和值为 64,整个消息为 25000A01F0FFFFFFFF64
该值的总和应为 0,校验和的逻辑为 (80 + Message)NOT+1 = Checksum value
And (80 + Message)Not +1 + Checksum = 0
我想在 C# 代码中执行此逻辑,但我不知道从哪里开始以及如何开始。
我有一个可行的解决方案,但它在 javascript:
function calculate_checksum8(N)
{
// convert input value to upper case
strN = new String(N);
strN = strN.toUpperCase();
strHex = new String("0123456789ABCDEF");
result = 0;
fctr = 16;
for (i=0; i<strN.length; i++)
{
if (strN.charAt(i) == " ") continue;
v = strHex.indexOf(strN.charAt(i));
if (v < 0)
{
result = -1;
break;
}
result += v * fctr;
if (fctr == 16)
fctr = 1;
else
fctr = 16;
}
if (result < 0)
{
strResult = new String("Non-hex character entered");
}
else if (fctr == 1)
{
strResult = new String("Odd number of characters entered. e.g. correct value = aa aa");
}
else
{
// Calculate 2's complement
result = (~(result & 0xff) + 1) & 0xFF;
// Convert result to string
strResult = strHex.charAt(Math.floor(result/16)) + strHex.charAt(result%16);
}
return strResult;
}
public string CreateCheckSum(string hex)
{
string withchk = "80" + hex;
string strres = "";
string strHex = "0123456789ABCDEF";
int res = 0;
int fctr = 16;
for (int i = 0; i < withchk.Length; i++)
{
if (withchk[i] == ' ')
continue;
var v = strHex.IndexOf(withchk[i]);
if (v < 0)
{
res = -1;
break;
}
res += v * fctr;
if (fctr == 16)
fctr = 1;
else
fctr = 16;
}
if (res < 0)
return "Invalid";
else if (fctr == 1)
return "Invalid";
else
{
res = (~(res & 0xff) + 1) & 0xFF;
strres = strHex[(int)Math.Floor(res / 16.0)].ToString() + strHex[res % 16].ToString();
}
return strres;
}
我有一个十六进制代码,我必须为其执行校验和逻辑,这将给我一个校验和,该校验和将添加到 Hexacode 消息的末尾并传递给接收 TCP 服务器,然后,消息 I从服务器接收的需要通过执行校验和逻辑来检查
例如:我有一个 07040A13 的十六进制代码,其校验和值为 58,添加并作为 07040A1358 传递。在接收时,我得到 25000A01F0FFFFFFFF,校验和值为 64,整个消息为 25000A01F0FFFFFFFF64 该值的总和应为 0,校验和的逻辑为 (80 + Message)NOT+1 = Checksum value And (80 + Message)Not +1 + Checksum = 0
我想在 C# 代码中执行此逻辑,但我不知道从哪里开始以及如何开始。
我有一个可行的解决方案,但它在 javascript:
function calculate_checksum8(N)
{
// convert input value to upper case
strN = new String(N);
strN = strN.toUpperCase();
strHex = new String("0123456789ABCDEF");
result = 0;
fctr = 16;
for (i=0; i<strN.length; i++)
{
if (strN.charAt(i) == " ") continue;
v = strHex.indexOf(strN.charAt(i));
if (v < 0)
{
result = -1;
break;
}
result += v * fctr;
if (fctr == 16)
fctr = 1;
else
fctr = 16;
}
if (result < 0)
{
strResult = new String("Non-hex character entered");
}
else if (fctr == 1)
{
strResult = new String("Odd number of characters entered. e.g. correct value = aa aa");
}
else
{
// Calculate 2's complement
result = (~(result & 0xff) + 1) & 0xFF;
// Convert result to string
strResult = strHex.charAt(Math.floor(result/16)) + strHex.charAt(result%16);
}
return strResult;
}
public string CreateCheckSum(string hex)
{
string withchk = "80" + hex;
string strres = "";
string strHex = "0123456789ABCDEF";
int res = 0;
int fctr = 16;
for (int i = 0; i < withchk.Length; i++)
{
if (withchk[i] == ' ')
continue;
var v = strHex.IndexOf(withchk[i]);
if (v < 0)
{
res = -1;
break;
}
res += v * fctr;
if (fctr == 16)
fctr = 1;
else
fctr = 16;
}
if (res < 0)
return "Invalid";
else if (fctr == 1)
return "Invalid";
else
{
res = (~(res & 0xff) + 1) & 0xFF;
strres = strHex[(int)Math.Floor(res / 16.0)].ToString() + strHex[res % 16].ToString();
}
return strres;
}