Ric*_*cky 3 javascript evernote node.js
我的问题是:
如何成功使用getResourceByHash(...)Evernote API 的方法?
我做了什么:
我在笔记内容中得到了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");
Run Code Online (Sandbox Code Playgroud)
接下来,我getResourceByHash(...) 以这种方式将变量应用于函数:
noteStore.getResourceByHash(GUID, bin, true, true, true,
function(err,result){
console.log(err);
console.log(result);
}
);
Run Code Online (Sandbox Code Playgroud)
但输出结果如下:
{identifier: 'Resources', key: 'c280c2ad525cc3914dc3a8c3b925487c02c2afc389c2ab21'}
undefined
Run Code Online (Sandbox Code Playgroud)
总之,我很困惑.
此外,您不能简单地将类型的值推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;
};
Run Code Online (Sandbox Code Playgroud)
首先,我们声明一个字节数组:
var byteArray = new Array(4)
Run Code Online (Sandbox Code Playgroud)
数组:[00000000,00000000,00000000,00000000]
通过使用逐位AND运算符&,我们"捕获"前8位,同时将结果值赋给新变量:
var byte = intToConvert & 0xff;
Run Code Online (Sandbox Code Playgroud)
我们的变量发生了什么:
intToConvert: 10101010 10101010 10101010 10101010
AND "0xff": 11111111 -------- -------- --------
Results in: 10101010
然后,我们将得到的单个字节放到临时字节数组的实际索引中:
byteArray[i] = byte;
Run Code Online (Sandbox Code Playgroud)
数组:[10101010,00000000,00000000,00000000]
现在,我们只需要减去刚刚添加到数组中的值,并从整数变量中删除一个字节:
intToConvert = (intToConvert - byte) / 256 ;
Run Code Online (Sandbox Code Playgroud)
2863311530 - 170 = 2863311360
2863311360/256 = 111848102863311360 => 10101010 10101010 10101010 00000000 11184810 => 10101010 10101010 10101010
继续该循环将逐字节地从整数传输到临时字节数组.因此,我们将获得一个包含4个单字节的字节数组,表示Character十六进制的一个整数或两个整数String.
如何转换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();
}
Run Code Online (Sandbox Code Playgroud)