物联网开发总结1--字节序以及大小端的问题

mac2024-05-10  7

声明:本文于网友的总结及本人的开发过程遇到的问题总结而来,如有侵权问题,请告知本人。

一、网络通信字节序转换问题

关于这个问题,主要是stm32与服务器平台之间的数据存储问题,具体如下:

问题:因为stm32与服务器平台属于不同的平台,即跨平台进行网络数据通信时必须进行字节序转换。换句话说,就是数据大端存储还是小端存储的讨论。原因:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以stm32发送时会首先取低地址取数据的高字节(这是大端模式)。注意及解决:但是注意的是stm32内部的字节存储是以小端模式进行的,如果直接取得话,就是低字节。所以在发送数据到平台时,需要提前在stm32进行字节序转换。

补充知识(网上摘抄):

网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;因此在UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节。也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;所以说,网络字节序是大端字节序;

在网络中传输字符串需要转换么?不需要,因为长度大于一个字节的才会涉及到转化,而字符串就是字符数组,每一个字符都正好是 一个字节,所以这个不涉及字符串的传输。

二、对于memcpy函数与大小端的关系

对于同平台来说,对于多字节的数据,比如int_16,int_32等,可以在封装的时候使用memcpy,在调用的时候也使用memcpy,这样就可以忽略数据大小端的问题。不同的平台上,数据为u16或u32时,使用memcpy需要考虑字节序,需要反转字节序,当然,对于u8数据,不需要考虑,比如u8数组或者字符串等。字符串也是u8类型的,也就是内部是一个一个的字符,与memcpy传值时,不需要考虑大小端问题。    

 

 

 

最新回复(0)