0

我有以下函数可以将十六进制字符串转换为字节数组。然后,我计算校验和:

private String CalcChecksum (String message) {

    /**Get string's bytes*/
    //byte[] bytes = DatatypeConverter.parseHexBinary(message.replaceAll("\\s","")).getBytes();
    message = message.replaceAll("\\s","");
    byte[] bytes = hexToByteArray(message);
    byte b_checksum = 0;

    for (int byte_index = 0; byte_index < bytes.length; byte_index++) {
        b_checksum += bytes[byte_index];
    }

    int d_checksum = b_checksum;  //Convert byte to int(2 byte)
    int c2_checksum = 256 - d_checksum;  //Hacer complemento a 2
    String hexString = Integer.toHexString(c2_checksum);  //Convertir el entero (decimal) a hexadecimal

    return hexString;
}


public static byte[] hexToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

进行一些测试,例如对于十六进制值“e0”,hexToByteArray得到值“-32”。所以 CalcChecksum 中的最终返回值为“17a”。

我需要的是在hexToByteArray函数中获取无符号值。这是因为我需要将 hexString 中的校验和发送到 MCU,其中校验和是用无符号值计算的,所以不是得到“-32”值,而是得到“224”,最终的十六进制值是“7a” “17a”。

我认为进行某种转换,例如当字节结果为负值时,请执行类似255 + "negative value" + 1. 这会将“-32”转换为“224”。

问题是我正在尝试这样做,但是在进行字节,int等之间的转换时遇到了一些错误...

那么,我该怎么办?

4

1 回答 1

1

目前,我认为这可能是解决方案。

只需在 CalcChecksum 函数中包含以下代码int d_checksum = b_checksum;

if (d_checksum < 0) {         
        d_checksum = 255 + d_checksum + 1;
    }
于 2013-08-07T08:43:01.760 回答