gpt4 book ai didi

javascript - 在 Nodejs 中解码相同的 base64 字符串会产生不同的结果

转载 作者:太空宇宙 更新时间:2023-11-04 00:32:57 24 4
gpt4 key购买 nike

我在通过 LoRa 设备 A 发送数据时遇到一个小问题。我正在发送十六进制字符串,定义为字符串或字符字符串(我只发送其中之一,但到目前为止结果相同)

String packet = "025555AD4148E1BE4100A06E421954C5BB";
//char data[] = "025555AD4148E1BE4100A06E421954C5BB";

尽管如此,当我在后端收到它时,该字符串在 Base64 中看起来像这样。

msg.payload = MDJhYmFhNmE0MTUyYjhjNDQxMDBjNDgwNDIwMDAwMDcwOQ==

这实际上与接收到不同设备 (LoRa B) 的 Base64 字符串不同,即使发送的有效负载相同,第二个设备(LoRa B 设备)也会收到此 msg.payload = AquqakFSuMRBAMSAQgAABwk=

如果我在nodejs中使用相同的功能解码LoRA和LoRa B base64

var b = new Buffer(msg.payload,'base64')

我得到的以下字符不是我的十六进制字符串

30326162616136613431353262386334343130306334383034323030303030373039 <= LoRa A02ABAA6A4152B8C44100C4804200000709 <= LoRa B

所以我认为这里发生的是原始的十六进制字符串是被分割成字符并通过 Lora 发送。因此我得到的是十六进制的 ascii 表示形式,对吗?

下一个问题是,如何获得原始的十六进制字符串?

提前致谢

问候!

编辑:

正如我有根据的猜测所暗示的那样,问题似乎在于有效负载在发送之前的处理方式,而不是在 Base64 编码/解码中

payload = 'MDJhYmFhNmE0MTUyYjhjNDQxMDBjNDgwNDIwMDAwMDcwOQ==';

b = new Buffer(payload,'base64')
console.log("Buffer b raw ");
console.log(b);
console.log("Buffer b stringfied ");
console.log(b.toString());

返回

Buffer b raw 
<Buffer 30 32 61 62 61 61 36 61 34 31 35 32 62 38 63 34 34 31 30 30 63 34 38 30 34 32 30 30 30 30 30 37 30 39>
Buffer b stringfied
02abaa6a4152b8c44100c4804200000709

查看code that is being used to transmit中的macTransmit函数在设备中,可以看到他们正在将数据包转换为十六进制字符

for (int i = 0; i < size; ++i) {
this->loraStream->print(static_cast<char>(NIBBLE_TO_HEX_CHAR(HIGH_NIBBLE(payload[i]))));
this->loraStream->print(static_cast<char>(NIBBLE_TO_HEX_CHAR(LOW_NIBBLE(payload[i]))));}

最佳答案

您的 LoRa 客户端库希望您为其提供要发送的字节数组,而不是十六进制数字字符串。

要发送字节<025555AD4148E1BE4100A06E421954C5BB>,您需要将数据包初始化为:

char packet[] = {0x02, 0x55, 0x55, 0xAD, 0x41, 0x48, 0xE1, 0xBE, 0x41, 0x00, 0xA0, 0x6E, 0x42, 0x19, 0x54, 0xC5, 0xBB};

当您像在 OP 中那样发送字符串时,它也是一个字节数组。但每个字节都是一个单个十六进制数字的 ASCII 编码(两个十六进制数字组成一个字节)。

如果你看一下这串 ASCII 字符

char data[] = "025555AD4148E1BE4100A06E421954C5BB";

作为字节,它将以 <30> 开头,因为<30>是字符“0”的 ASCII 编码。然后就会出现<32> ,因为这是 ASCII 字符“2”的编码。所以而不是单字节 <02>位于data[0] ,您的消息以两个字节 <30 32> 开头。你可以看到这是怎么回事,对吧?那个长缓冲区<Buffer 30 32 61 62 61 61 36 61 34 31 35 32 62 38 63 34 34 31 30 30 63 34 38 30 34 32 30 30 30 30 30 37 30 39>正是您发送的消息的 ASCII 表示形式“025555AD4148E1BE4100A06E421954C5BB”。这证实了您的 base64 转换没有任何问题。

for您显示的循环确认该库需要字节。它获取数据包的每个字节,将其分成两个半字节,并将每个半字节(十六进制数字)转换为相应的 ASCII 字符 (0-F)。它以文本字符的形式发送数据包,因为 Microchip RN2483 LoRa 模块设计为通过串行协议(protocol)与其主机 Controller 进行通信。在内部,它在传输之前将数据包的文本版本转换回字节。

关于javascript - 在 Nodejs 中解码相同的 base64 字符串会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271205/

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