十六进制字符串转为字节数组

4
我正在尝试弄清楚Java中的十六进制字符串转字节数组函数如何生成正确的二进制数,而JavaScript则得出完全不同的结果。
public static byte[] hexStringToByteArray(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;
}

JavaScript
this.hexStringToByteArray = function(s) {

    var len = s.length;
    var data = [];
    for(var i=0; i<(len/2); data[i++]=0) {} 

    for (var i = 0; i < len; i += 2) {

        data[i / 2] = (parseInt(s.charAt(i), 16) << 4)
                             + parseInt(s.charAt(i+1), 16);

    }

    return data;

};

Java:

Java:

"a3" = -93;

JavaScript:

"a3" = 163;

如果没有(byte)的转换,Java会生成与javascript相同的数字。如果无法将变量指定为字节,则如何使javascript生成与Java相同的数字(正数或负数)呢?
1个回答

3

如果您想生成与Java相同的结果,则需要将数字保持在[-128, 127]范围内。尝试这样做:

this.hexStringToByteArray = function(s) {

    var len = s.length;
    var data = [];
    for(var i=0; i<(len/2); data[i++]=0) {} 

    for (var i = 0; i < len; i += 2) {

        var value = (parseInt(s.charAt(i), 16) << 4)
                             + parseInt(s.charAt(i+1), 16);

        // "transforms" your integer to the value a Java "byte" would have:
        if(value > 127) {
            value -= 256;
        }

        data[i / 2] = value;

    }

    return data;

};

非常感谢,问题已经解决了。我今天花了数小时绞尽脑汁。 - UnKnownHer0
写于2021年 :) 非常感谢,你救了我的一天。 - Eren Tüfekçi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接