2015-03-12 2 views
3

Мой вопрос:
Как успешно использовать метод getResourceByHash(...) API Evernote?Преобразование шестнадцатеричной строки в байтовый массив

То, что я сделал:
я получил шестигранный хэш эм-медиа в содержании примечания: 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 

В общем, я запутался.

+0

В зависимости от ваших предоставленных данных, возникает ошибка при преобразовании гекса в двоичный или передавая это значение функции: ключ 'не c280c2ad525cc3914dc3a8c3b925487c02c2afc389c2ab21'could быть двоичным как это содержит буквы, вместо этого он почти такой же, за исключением конечного «c2», если вы его добавляете. –

+0

thx, я также подозреваю неправильное преобразование функции hex2bin. и знаете ли вы правильные способы сделать это? спасибо – Ricky

ответ

5

Кроме того, вы не можете просто нажать значение типа 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; 
};  

Demonstration of back and forth conversion (JS-Fiddle)


Объяснение кодовых линий

  1. Сначала мы объявляем массив байтов:

    var byteArray = new Array(4) 
    

    Array: [00000000, 00000000, 00000000, 00000000]

  2. С помощью bit-wise AND operator & мы «захватить» первые 8 бит при назначении полученное значение новой переменной:

    var byte = intToConvert & 0xff; 
    

    What's happening with our variables:

     
    intToConvert: 10101010 10101010 10101010 10101010
    AND "0xff": 11111111 -------- -------- --------
    Results in: 10101010
  3. Затем мы помещаем полученный одиночный байт фактический индекс массива временного байта:

    byteArray[i] = byte; 
    

    Array: [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 одиночных байтов, представляющих одно целое или два Character из шестнадцатеричного числа String.


Как конвертировать byte в Integeris well explained here.
Так ваша обновленный 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(); 
} 
+0

ну, он не работает. Результат преобразования, примененный к функции, выведет '[Ошибка: не может прочитать длину двоичных данных]' Согласно [link] (https://dev.evernote.com/doc/ reference/NoteStore.html # Fn_NoteStore_getResourceByHash), параметр contenthash должен быть строкой. И более того, даже если я изменяю ur пути вывода строки, он все еще не работает. – Ricky

+0

Так что я, должно быть, нашел класс из другого пакета, извините за это. Как вы «меняете свой путь к выходной строке»? Ожидаемое значение: 11000010100000001100001010101101010100100101110011000011100100011001101110000111010100011000011101110010010010101001000011111001011000010101011111100001110001001110000101010101100100001 –

Смежные вопросы