Javascript window.atob->;十六进制-与预期结果不同

Javascript window.atob->;十六进制-与预期结果不同,javascript,base64,hex,byte,Javascript,Base64,Hex,Byte,我有一个BMP图像,需要通过TCP/IP将其发送到设备。我们公司已经有了C库,可以处理这个问题,但我需要用JavaScript来完成。不幸的是,我无法访问库的源代码,也无法访问设备系统 这是示例图像的Base64字符串(黑白复选标记): Qk2+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap///wD///wD///wD/

我有一个
BMP
图像,需要通过
TCP
/
IP
将其发送到设备。我们公司已经有了
C
库,可以处理这个问题,但我需要用JavaScript来完成。不幸的是,我无法访问库的源代码,也无法访问设备系统

这是示例图像的
Base64
字符串(黑白复选标记):

Qk2+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap///wD///wD///wD///wD///H///4AP///8AD///aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap///wD/wD///wD==

我使用
window.atob
并将其编码为十六进制。我使用这个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);
函数toHex(str){ var结果=“”; 对于(变量i=0;i 它给了我这个结果,这几乎是预期的结果:

424dbe00000003e0002800020000200001010000080000c4e00c4e00000000000000ffffff0ffffffffffe1ffffffc0ffffff807fffff07ffffe03ffffc03ffff801ffff00fffe00fffc807ff9c07ffbc103ff7e301ff7f781ffbef80ffbcfc07fc3fe07ffffe03fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87
424DBE000000003E00028000020000100000008000C4E00C4E00000000000000FFFFFF0FFFFFFFF1FFFFFC0FFFFFF807FFFFFFF07FFFFFF03FFC03FFFF801FFFFFFF00FFFFFE00FFFFFC807FF9FFC07FFBC103FF7E301FF7F781FFFFFF80FFFFFFFFFFFFFF07FFFFFFFFFFFFFFFFFF03FFFFFFFFFFFFFC7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF7FFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFF

库正确发送完全相同的图像(设备接受该消息)。这是它的外观(从日志复制):

BE00424DB10000000000003E00000208000000020000000000000000100010000000000000000000000000000000000000000000000000000C40000000E0000000000000000FFFFFF00FFFFFFFFFFFF00FFFFFFFFFF807FFFFFFFFFFF007FFFFFF003FFC003FF8001FFFFFFF0000FFFFFF000FFFF000FFFF000FFFF000FFFFFF0000CF0000CF0000CF0000FFFFFFFFFFFFFFFFFF000FFFFFFFFFF07FFFFFFFFFFFFFF700FFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFF300FFFFFFFFFFFF3FFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFFFFCFFFFFFFFFFFFFFFFFFFF7FFFFFFFF87

这就是我需要从JavaScript中的
Base64
中获得的内容。有可能吗?还是我遗漏了什么


该库的文档说明图像必须是2B二进制数据(小端)。我不明白。我是否应该以其他方式对图像进行编码?

一个选项是分别对每个字节进行编码,以确保正确的结尾

img=“Qk2+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadedgaaaxa4aaaaaaaaaaaaaaaaaaaaaap///wD///wD///A///gH///wB///4AP///8AD//+AAf///AAD///gAA///yAAH 5wAB/+8EAP/fjAB/394Af aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap///aa///aa///aa///aa///w7a///v5///7+aap///v3///hwf///38///hwf///97
str=atob(img)
buf=[]
函数十六进制(str,pos){
返回('000'+(str.charCodeAt(pos)| | 0).toString(16)).substr(-2);
}
对于(变量i=0;iconsole.log(buf.join(“”))
一个选项是分别对每个字节进行编码,以确保正确的结尾

img=“Qk2+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadedgaaaxa4aaaaaaaaaaaaaaaaaaaaaap///wD///wD///A///gH///wB///4AP///8AD//+AAf///AAD///gAA///yAAH 5wAB/+8EAP/fjAB/394Af aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap///aa///aa///aa///aa///w7a///v5///7+aap///v3///hwf///38///hwf///97
str=atob(img)
buf=[]
函数十六进制(str,pos){
返回('000'+(str.charCodeAt(pos)| | 0).toString(16)).substr(-2);
}
对于(变量i=0;i
这是示例图像的Base64字符串(黑白复选标记)
它给了我这个结果,这几乎是预期的结果:

424dbe00000003e0002800020000200001010000080000c4e00c4e00000000000000ffffff0ffffffffffe1ffffffc0ffffff807fffff07ffffe03ffffc03ffff801ffff00fffe00fffc807ff9c07ffbc103ff7e301ff7f781ffbef80ffbcfc07fc3fe07ffffe03fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87
“几乎预期的结果”是什么意思?这些字节构成了下面的图像(另存为.bmp
您期望的
“黑白复选标记”
图像:

附言:

正确的.bmp文件有190个字节。您的库版本(从日志复制)给出194字节的结果

库的字节版本的文件大小以2字节开始
short

BE 00
=190
读取为
00 BE
的尾端时),然后是位图文件的其余字节(总共190字节)。这使得总共190个字节+短的
的2个字节。然后,它将这两个神秘的
10
10
字节从位置114开始相加。总计194字节

对我来说。。。库正在损坏已经很好的图像字节,但您说设备接受它吗?
它是否也接受“几乎预期的结果”十六进制字节

这是示例图像的Base64字符串(黑白复选标记)
它给了我这个结果,这几乎是预期的结果:

424dbe00000003e0002800020000200001010000080000c4e00c4e00000000000000ffffff0ffffffffffe1ffffffc0ffffff807fffff07ffffe03ffffc03ffff801ffff00fffe00fffc807ff9c07ffbc103ff7e301ff7f781ffbef80ffbcfc07fc3fe07ffffe03fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87
“几乎预期的结果”是什么意思?这些字节构成了下面的图像(另存为.bmp
您期望的
“黑白复选标记”
图像:

附言:

正确的.bmp文件有190个字节。您的库版本(从日志复制)给出194字节的结果

库的字节版本的文件大小以2字节开始
short

BE 00
=190
读取为
00 BE
的尾端时),然后是位图文件的其余字节(总共190字节)。这使得总共190个字节+短的
的2个字节。然后,它将这两个神秘的
10
10
字节从位置114开始相加。总计194字节

对我来说。。。库正在损坏已经很好的图像字节,但您说设备接受它吗?
它也接受“几乎预期的结果”十六进制字节吗?

看起来像是“endianness”问题“库说图像必须是2B二进制数据”这个库叫什么(链接)?以前从未听说过“2B二进制数据”…看起来像是“endianness”问题“l”