计算Java中byte []的校验和,并得到预期的结果

时间:2015-09-03 21:44:08

标签: java ascii checksum

我需要帮助解决一些我无法解决的问题。我要做的是计算已知字节[]的校验和。让我们从已知的值开始:

我必须将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;
}

2 个答案:

答案 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。