2017-01-26 14 views
1

У меня есть изображение BMP, и мне нужно отправить его на устройство через TCP/IP. У нас уже есть библиотека C в нашей компании, которая может справиться с этим, но мне нужно сделать это в JavaScript. К сожалению, у меня нет доступа к исходному коду библиотеки, ни к системе устройства.Javascript window.atob -> HEX - отличный результат, чем ожидалось

это Base64 строку образец изображения (черный & белой галочки):

Qk2 + AAAAAAAAAD4AAAAoAAAAIAAAACAAAAABAAEAAAAAAIAAAADEDgAAxA4AAAAAAAAAAAAAAAAAAP /// сод ////// + Н //// А ////Gh /// /// Wb 4AP // 8AD // + ААР // AAD // GAA // yAAH/5wAB/+ 8EAP/fjAB/394Af +++ AD/vPwAf8P + AH /// /// дА 9AH /// /// v5 7/Р /// /// FX 7 + Р // +/г /// 38f // +/п /// /// 38 +/ж /// v3/// 97 //// hw ==

Я использую window.atob и кодирую его в HEX. Я использую этот JS функции:

function toHex(str) { 
    var result = ''; 
    for (var i = 0; i < str.length; i++) { 
     result += str.charCodeAt(i).toString(16); 
    } 
    return result; 
} 
var str = window.atob(base64img); 
var result = toHex(str); 

Это дает мне этот результат, который почти ожидаемый результат:

424dbe00000003e0002800020000200001010000080000c4e00c4e00000000000000ffffff0ffffffffffe1ffffffc0ffffff807fffff07ffffe03ffffc03ffff801ffff00fffe00fffc807ff9c07ffbc103ff7e301ff7f781ffbef80ffbcfc07fc3fe07ffffe03fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87

Библиотека посылает точное то же изображение правильно (устройство принимает сообщение). Вот как это выглядит (копируется из журнала):

be00424dbe000000000000003e000000280000002000000020000000010001000000000080000000c40e0000c40e0000000000000000000000000000ffffff00ffffffffffe1ffffffc0ffffff807fffff007ffffe003ffffc003ffff8001ffff0000fffe0000fffc80007ff9c0007ffbc10101003ff7e3001ff7f7801ffbef800ffbcfc007fc3fe007ffffe003fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87

Так это то, что мне нужно, чтобы получить от Base64 в моей JavaScript. Возможно ли это? Или я чего-то не хватает?

Документация для библиотеки говорит, что изображение должно быть двоичными данными 2B (Little Endian). Я этого не понимаю. Должен ли я кодировать изображение любым другим способом?

+0

Похож на проблему «endianness» – Pointy

+0

_ «Библиотека говорит, что изображение должно быть двоичными данными 2B» _ что это за библиотека, называемая (ссылка)? Никогда не слышал о «двоичных данных 2B» _ до ... –

ответ

0

Один из вариантов будет кодировать каждый байт отдельно, чтобы обеспечить правильную точность.

img = "Qk2+AAAAAAAAAD4AAAAoAAAAIAAAACAAAAABAAEAAAAAAIAAAADEDgAAxA4AAAAAAAAAAAAAAAAAAP///wD//////+H////A////gH///wB///4AP//8AD//+AAf//AAD//gAA//yAAH/5wAB/+8EAP/fjAB/394Af+++AD/vPwAf8P+AH///gA///9AH///v5///7/P///fx///7+P//+/z///38f//+/n///38///+/f///v3///97////hw==" 
 

 
str = atob(img) 
 

 
buf = [] 
 

 
function hex(str, pos) { 
 
    return ('000' + (str.charCodeAt(pos) || 0).toString(16)).substr(-2); 
 
} 
 

 

 
for (var i = 0; i < str.length; i+= 4) { 
 
    buf.push(hex(str, i+2)); 
 
    buf.push(hex(str, i+3)); 
 
    buf.push(hex(str, i+0)); 
 
    buf.push(hex(str, i+1)); 
 
} 
 

 
console.log(buf.join(''))

Это не соответствует вашему желаемому результату точно, вы уверены, что соответствует данной строке base64?

С другой стороны, ваш исходный результат выглядит лучше, 424d - это правильные байты для запуска BMP-файла (BM), а be00 - нет.

0

Это строка Base64 образца изображения (черная белая галочка) ...
Это дает мне этот результат, который почти ожидаемый результат:

424dbe00000003e0002800020000200001010000080000c4e00c4e00000000000000ffffff0ffffffffffe1ffffffc0ffffff807fffff07ffffe03ffffc03ffff801ffff00fffe00fffc807ff9c07ffbc103ff7e301ff7f781ffbef80ffbcfc07fc3fe07ffffe03fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87 

Что вы имеете в виду «почти ожидаемого результата», эти байты сделать изображение ниже (сохранить как .bmp).
Ваш ожидается "a black&white checkmark" изображение:

PS:

Правильный .bmp файл имеет 190 байт. Ваша версия библиотеки (скопированная из журналов) дает результат 194 байта.

Версия для байта библиотеки имеет начало 2 байта short для размера файла.
То есть BE 00 (= 190 при чтении как endian 00 BE), за которым следуют остальные байты файла битмафта (190 байтов). Это составляет 190 байтов + 2 байта short. Затем он добавляет эти два таинственных байта 10 и 10, начиная с позиции 114. Всего 194 байта.

Для меня ... библиотека искажает байты с уже изображенным изображением, но вы говорите, что устройство принимает его?
Принимает ли он «почти ожидаемый результат» hex-байты тоже?

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

  • Нет связанных вопросов^_^