2015-12-16 2 views
8

У меня есть массив байтов формы [4,-101,122,-41,-30,23,-28,3,..], которую я хочу, чтобы преобразовать в виде 6d69f597b217fa333246c2c8 Я использую ниже функцииByte массив преобразования строки Hex в JavaScript

function toHexString(bytes) { 
    return bytes.map(function(byte) { 
    return (byte & 0xFF).toString(16) 
    }).join('') 
} 

который дает мне строку в той же форме, но я подозреваю, что это не эффективное преобразование, потому что шестнадцатеричная строка немного короче, чем ожидалось. Я думаю, что перевод должен получить «0a10a6dc». Пожалуйста, скажи мне, если я ошибаюсь, или это право конверсии, но, может быть, я не использую правильный массив байт

байтового массив 4,-127,45,126,58,-104,41,-27,-43,27,-35,100,-50,-77,93,-16,96,105,-101,-63,48,-105,49,-67,110,111,26,84,67,-89,-7,-50,10,-12,56,47,-49,-42,-11,-8,-96,-117,-78,97,-105,9,-62,-44,-97,-73,113,96,23,112,-14,-62,103,-104,90,-14,117,78,31,-116,-7

Соответствующих преобразования 4812d7e3a9829e5d51bdd64ceb35df060699bc1309731bd6e6f1a5443a7f9ceaf4382fcfd6f5f8a08bb261979c2d49fb771601770f2c267985af2754e1f8cf9

+0

Извините, я обновил код. Я изменил переменные перед публикацией, но теперь я использую исходный код – Actung

ответ

24

Вы пропускаете отступы в шестнадцатеричное преобразование. Вы хотите использовать

function toHexString(byteArray) { 
    return Array.from(byteArray, function(byte) { 
    return ('0' + (byte & 0xFF).toString(16)).slice(-2); 
    }).join('') 
} 

так, чтобы каждый байт преобразуется в ровно две шестнадцатеричные цифры. Ваш ожидаемый результат будет 04812d7e3a9829e5d51bdd64ceb35df060699bc1309731bd6e6f1a5443a7f9ce0af4382fcfd6f5f8a08bb2619709c2d49fb771601770f2c267985af2754e1f8cf9

+0

Спасибо @Bergi его рабочий :) – Actung

+0

Это не будет работать, если byteArray является типизированным массивом, который не может содержать строковые значения: если вы передадите Uint8Array, результатом карты также будет Uint8Array, поэтому значение, подобное «ff», не приведет к соединению(). – grantpatterson

+0

@ grantpatterson Ах, правильно. Исправлена. – Bergi

1

Вам необходимо заполнить шестнадцатеричное преобразование с соответствующим числом ведущих нулей.

1

Использование map() не будет работать, если вход типа как Uint8Array: результат map() также Uint8Array, который не может содержать результаты преобразования строки.

function toHexString(byteArray) { 
    var s = '0x'; 
    byteArray.forEach(function(byte) { 
    s += ('0' + (byte & 0xFF).toString(16)).slice(-2); 
    }); 
    return s; 
} 
Смежные вопросы