gpt4 book ai didi

Javascript window.atob -> HEX - 结果与预期不同

转载 作者:行者123 更新时间:2023-11-28 05:04:13 30 4
gpt4 key购买 nike

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

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

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==

我使用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);

它给了我这个结果,这几乎是预期的结果:

424dbe00000003e0002800020000200001010000080000c4e00c4e00000000000000ffffff0ffffffffffe1ffffffc0ffffff807fffff07ffffe03ffffc03ffff801ffff00fffe00fffc807ff9c07ffbc103ff7e301ff7f781ffbef80ffbcfc07fc3fe07ffffe03fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87

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

be00424dbe000000000000003e000000280000002000000020000000010001000000000080000000c40e0000c40e0000000000000000000000000000ffffff00ffffffffffe1ffffffc0ffffff807fffff007ffffe003ffffc003ffff8001ffff0000fffe0000fffc80007ff9c0007ffbc10101003ff7e3001ff7f7801ffbef800ffbcfc007fc3fe007ffffe003fffff401fffffbf9fffffbfcfffffdfc7ffffefe3ffffeff3fffff7f1fffffbf9fffffdfcfffffefdfffffefdffffff7bffffff87

这就是我需要从 JavaScript 中的 Base64 获取的内容。有可能吗?或者我错过了什么?

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

最佳答案

一个选项是单独编码每个字节以确保正确的字节序。

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 不是。

关于Javascript window.atob -> HEX - 结果与预期不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41876456/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com