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

Converting a hexadecimal String to byte array

本文关键字:字节 字节数 数组 转换 十六进制 字符串      更新时间:2023-09-26

我的问题是:
如何成功使用Evernote API的方法getResourceByHash(...)

我做了什么:
我在笔记内容中得到了em-media的十六进制哈希:80ad525cd14de8f925487c02afc9ab21

然后我使用以下函数将十六进制String转换为字节:

function hex2bin(hex){
    var bytes = [];
    for(var i=0; i< hex.length-1; i+=2) {
        bytes.push(parseInt(hex.substr(i, 2), 16));
    }
    return String.fromCharCode.apply(String, bytes);    
}
var bin = hex2bin("80ad525cd14de8f925487c02afc9ab21");

接下来,我以这种方式将变量应用于函数getResourceByHash(...)

noteStore.getResourceByHash(GUID, bin, true, true, true, 
    function(err,result){
        console.log(err);
        console.log(result);
    }
);

但输出结果是:

{identifier: 'Resources', key: 'c280c2ad525cc3914dc3a8c3b925487c02c2afc389c2ab21'}
undefined

总而言之,我很困惑。

此外,您不能简单地将类型为 Integer 的值推送到字节数组。整数用 32 位(4 个字节)表示,因此您首先必须在逐个计算单个字节时"拆分"该数字:

intToByteArray = function(intToConvert) {
    var byteArray = new Array(4)
    for(var i = 0; i < byteArray.length; i++) {
        var byte = intToConvert & 0xff;
        byteArray[i] = byte;
        intToConvert = (intToConvert - byte) / 256 ;
    }
    return byteArray;
};     

来回转换演示(JS-小提琴)


代码行说明

  1. 首先,我们声明一个字节数组:

    var byteArray = new Array(4)
    

    阵列:[00000000

    、00000000、00000000、00000000]
  2. 通过使用按位AND运算符&,我们"捕获"前 8 位,同时将结果值分配给一个新变量:

    var byte = intToConvert & 0xff;
    

    我们的变量发生了什么:

    intToConvert: 10101010 10101010 10101010 10101010
    和"0xff":11111111 -------- -------- --------
    结果: 10101010
  3. 然后,我们将生成的单字节放入临时字节数组的实际索引中:

    byteArray[i] = byte;
    
    数组:[10101010, 00000000, 00000000

    , 00000000]

  4. 现在,我们只需要减去刚刚添加到数组中的值并从整数变量中删除一个字节:

    intToConvert = (intToConvert - byte) / 256 ;
    

    2863311530 - 170 = 2863311360
    2863311360/256 = 11184810

    2863311360 => 10101010 10101010 10101010 00000000  11184810 => 10101010 10101010 10101010

继续此循环将逐个字节地从整数传输到临时字节数组。因此,我们将得到一个由 4 个单字节组成的字节数组,代表十六进制String的一个整数或两个Character


如何将byte转换为Integer在这里得到了很好的解释。
因此,更新后的hex2bin(String)应如下所示:

function hex2bin(hexString) {
    var bytes = new Array(hexString.length / 2);
    for(var i = 0; i < hexString.length-1; i+=2) {
        bytes.push(
            intToByteArray(
                parseInt(hexString.substr(i, 2), 16)
            )
        );
    }
    StringBuilder sb = new StringBuilder(bytes.length * 8);
    for(byte b : bytes) {
        sb.append(Integer.toBinaryString((b & 0xFF) + 0x100).substring(1));    
    }
    return sb.toString();
}