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

在串行通信中,我需要将来自python的密文发送到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字节块创建4字节长的数据。

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

OR字节是不够的,你必须将它们移到正确的位置。

你目前在做什么,(注意你是plaintext[1]索引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] | -------------------------------------------------------------------------------- 

所以你必须先将左移位运算符<< ,和OR后的字节移动到适当的位置。

这是一个例子:

 #include  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; } 

输出:

在此处输入图像描述

在记忆中:

 ---------------------------------------------------------------------- | 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的方式,它不会不必要地打印零。 如果你在32位变量中有0x70 ,那么它实际上是0x00000070但是printf将打印0x70 ,因为不必要的零被砍掉,除非你另有说明。 这就是%02x用武之地。在%02x02告诉printf您要显示2个字节,无论如何它会在0x00情况下打印两个零

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

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

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