gpt4 book ai didi

python - 如何在C+python+UART中正确表示单词?

转载 作者:行者123 更新时间:2023-11-30 15:03:08 25 4
gpt4 key购买 nike

在串行通信中,我需要将密文从 python 发送到 UART,UART 可以使用 C 读取它。

首先,在Python端使用这种技术:

ciphertext=(b'\x24\x70\xb4\xc5\x5a\xd8\xcd\xb7\x80\x6a\x7b\x00\x30\x69\xc4\xe0\xd8')
ser.write(ciphertext)

在C端,我将接收到的密文放入缓冲区中。我测试如果第一个字节是24,则数据包的开始:

if (buffer_RX[0]=='\x24')
{
for (i=1;i<=17;i++) //sizeof(buffer_RX)==17
{
printf("%x \n",buffer_RX[i]);
}
}
else {
printf("It is not a packet!");
}

我得到的结果是:

70
b4
c5
5a

d8
cd
b7
80

6a
7b
0
30

69
c4
e0
d8

所以我有两个问题,- 首先是为什么 \x00 以这种方式显示,我的意思是只有一个零 0?- 第二个问题是我怎样才能有同样的表示:

const unsigned int ciphertext[4] = {0x70b4c55a, 0xd8cdb780, 0x6a7b0030,0x69c4e0d8};

如果我认为这是字节之间的串联,我的意思是可能是:

   unsigned int plaintext[1];
plaintext[1]= buffer_RX[3]|buffer_RX[4]|buffer_RX[5];

但我不确定,我认为我有语法错误。

此表示将帮助我继续后续步骤。但我不知道如何才能拥有它。

最佳答案

如果您想从 1 字节 block 创建 4 字节长的数据。

const unsigned int ciphertext[4] = {0x70b4c55a, 0xd8cdb780, 0x6a7b0030,0x69c4e0d8};

仅对字节进行“或”操作是不够的,您必须将它们移动到正确的位置。

您当前正在做什么(请注意,您过度索引 plaintext[1] 这应该是 plaintext[0] ):

unsigned int plaintext[1];
plaintext[1]= buffer_RX[3]|buffer_RX[4]|buffer_RX[5];

内存中有这个结果,假设 int是 32 位,4 字节长:

--------------------------------------------------------------------------------
| 3. byte | 2. byte | 1. byte | 0. byte |
--------------------------------------------------------------------------------
| 0x00 | 0x00 | 0x00 | buffer_RX[3] | buffer_RX[4] | buffer_RX[5] |
--------------------------------------------------------------------------------

所以你必须首先使用左移运算符将适当的字节移动到正确的位置 << ,并对之后的字节进行或运算。

这是一个例子:

#include <stdio.h>

int main()
{
unsigned char buffer_RX[4];

buffer_RX[0] = 0x70;
buffer_RX[1] = 0xb4;
buffer_RX[2] = 0xc5;
buffer_RX[3] = 0x5a;

unsigned int plaintext[1];

plaintext[0] = (buffer_RX[0]<<24) | (buffer_RX[1]<<16) | (buffer_RX[2]<<8) | buffer_RX[3];

printf("plaintext: %08x\n", plaintext[0]);

return 0;
}

输出:

enter image description here

内存中:

----------------------------------------------------------------------
| 3. byte | 2. byte | 1. byte | 0. byte |
----------------------------------------------------------------------
| buffer_RX[0] | buffer_RX[1] | buffer_RX[2] | buffer_RX[3] |
----------------------------------------------------------------------

您可以看到buffer_RX[0]已移位 24,即 3 个字节,因此它会跳过前三个单元,跳转到最后一个。

buffer_RX[1]16 组成,它是 2 个字节,因此它跳到前两个,buffer_RX[2]8 组成,它是 1 个字节,因此它会跳过第一个。和buffer_RX[3]没有被移动,因为它到达了第一位。

<小时/>

关于0x00 ,用 8 位表示为零。如果你打印它,那将只是0。如果您打印0x0000它也将是0。就是这样printf默认情况下打印0,不必要时不会打印零。如果您有0x70在 32 位变量中,它实际上是 0x00000070但是printf将打印0x70 ,因为不必要的零被截掉,除非您另有说明。那就是%02x的地方进来。在 %02x 02告诉printf无论如何你都想显示 2 个字节,所以在 0x00 的情况下它会打印两个零

printf("%02x \n",buffer_RX[i]);

如果你想打印0x00000070的整个32位(4字节)以下行将执行此操作:

printf("%08x \n",buffer_RX[i]);

关于python - 如何在C+python+UART中正确表示单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40831263/

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