编码解码字节

Roh*_*hit 4 c sockets embedded encoding decoding

我有一个嵌入式设备,以这种格式发送UTC日期(日期是4个字节):

 buffer.push_back((BYTE)(time_utc & 0x000000FF));
 buffer.push_back((BYTE)((time_utc & 0x0000FF00) >> 8));
 buffer.push_back((BYTE)((time_utc & 0x00FF0000) >> 16));
 buffer.push_back((BYTE)((time_utc & 0xFF000000) >> 24));
Run Code Online (Sandbox Code Playgroud)

在服务器上,我收到字节并存储它们socket_buf,从索引0-3开始并使用以下逻辑对其进行解码

mypkt.dateTime = ( ( socket_buf[0] << 24) +  
(socket_buf[1 ] << 16) +  socket_buf[2] << 8) + 
(socket_buf[3] << 0));
Run Code Online (Sandbox Code Playgroud)

但我不确定是否正确解码它,因为我得到的日期不正确.任何人都可以建议我解码它的正确方法吗?我使用Linux命令解码日期(16711840是我通过解码获得的数字):

#date -d @16711840
Run Code Online (Sandbox Code Playgroud)

Aln*_*tak 8

编写代码是小端 - 它首先发送最低有效字节.

你的阅读代码期待大端 - 它采用第0个字节并将其向左移位24位.

请注意,在这两种情况下,代码都不依赖于本地机器的字节序 - 所写的代码与此无关,只是它们彼此不一致.

试试这个,相反:

mypkt.dateTime = ((socket_buf[0] <<  0) +
                  (socket_buf[1] <<  8) + 
                  (socket_buf[2] << 16) +
                  ((uint32_t)socket_buf[3] << 24));
Run Code Online (Sandbox Code Playgroud)

演员是必要的(但只在最后一班)因为0x80 - 0xff将被转换为a signed int并且未定义移位到符号位的位会发生什么(感谢@Lundin)

注意:16711840不是"当前"Unix纪元日期时间值,无论您使用哪个字节顺序代表它.你可能在其他地方有其他问题.