我需要帮助解决一些我无法解决的问题。我要做的是计算已知字节[]的校验和。让我们从已知的值开始:
我必须将8位数值转换为8字节的ASCII:
Value = 33053083
Converted (asciiValue) = 33:33:30:35:33:30:38:33
这是正确的,因为它符合给我的预期值。
接下来,我需要"计算ASCII值的校验和(asciiValue)。提取最后2位数(右对齐)。结果是' Checksum'。"
我知道这个计算校验和的值应该是99。
我到处寻找并尝试了所有事情,但我无法想出99的期望值。
感谢您的帮助!
编辑添加给定算法(在C中):
unsigned char
vls_byteSum(char *blk, int len)
{
int i;
unsigned char sum = 0;
for (i=0; i < len; ++i)
sum += blk[i];
return sum;
}
答案 0 :(得分:3)
您在评论中发布的代码非常正确,除了将char
更改为byte
:
public static byte vls_byteSum(byte[] blk) {
byte sum = 0;
for (int i = 0; i < blk.length; i++)
sum += blk[i];
return sum;
}
用这个测试:
byte result = vls_byteSum(new byte[] { 0x33, 0x33, 0x30, 0x35, 0x33, 0x30, 0x38, 0x33 });
System.out.printf("0x%02x = %d = %d", result, result, Byte.toUnsignedInt(result));
输出:
0x99 = -103 = 153
答案 1 :(得分:1)
以下代码应该为您完成。
public static int checkSum(byte[] input) {
int checkSum = 0;
for(byte b : input) {
checkSum += b & 0xFF;
}
return checkSum;
}
b & 0xFF
将字节转换为整数并将其赋予无符号值,这意味着255将被解释为255而不是-1。