Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编码解码字节_C_Sockets_Encoding_Embedded_Decoding - Fatal编程技术网

C 编码解码字节

C 编码解码字节,c,sockets,encoding,embedded,decoding,C,Sockets,Encoding,Embedded,Decoding,我有一个嵌入式设备,它以这种格式向我发送UTC日期(日期为4字节): 在服务器上,我接收字节并将其存储在socket_buf中,从索引0-3开始,使用以下逻辑对其进行解码 mypkt.dateTime = ( ( socket_buf[0] << 24) + (socket_buf[1 ] << 16) + socket_buf[2] << 8) + (socket_buf[3] << 0)); 你把插座清理干净了吗 你确定你的电脑是bi

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

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

mypkt.dateTime = ( ( socket_buf[0] << 24) +  
(socket_buf[1 ] << 16) +  socket_buf[2] << 8) + 
(socket_buf[3] << 0));

你把插座清理干净了吗

你确定你的电脑是big enddian吗

另外,我给你一个建议:用or运算符代替plus

这可以节省你更多的时间

mypkt.dateTime = (long) ( ( socket_buf[0] << 24) |  (socket_buf[1] << 16) |  socket_buf[2] << 8) | (socket_buf[3] << 0));
mypkt.dateTime=(long)((socket_buf[0])写入的代码是little endian-它首先发送最低有效字节

您的读取代码需要big-endian,它将第0个字节向左移位24位

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

请尝试以下方法:

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

mypkt.dateTime=((socket_buf[0]因为
socket_buf
声明为无符号字符,
socket_buf[0]这两台机器都是endian?我认为这与网络中的字节顺序有关。网络字节顺序是big-endian,而大多数英特尔处理器是little-endian=>这就是可能出现错误的地方。你看过C函数
htons()
ntohs()了吗
?但我也在发送其他数据,我将要正确提取这些数据,我更关心我的逻辑,因为我正在从socket\u buf正确解码数据。我不确定是否需要像设备上那样执行操作。请显示
socket\u buf
的声明,这可能是错误的原因。socket\u buf被定义为unsigned char*原始帖子中的代码是独立于endian的。按位或与加法等效。启用优化器时,性能应该没有差异(但在这种情况下,或可能更容易阅读和理解)。此外,如果
socket\u buf
是错误的整数类型,您建议的方法将不起作用。对有符号长的强制转换是毫无意义和不合理的。是的,套接字缓冲区是清晰的。Lundin那么您的意思是说,我不需要像在设备的原始代码中那样执行&-ing。此代码对我来说似乎很好:mypkt.dateTime=((插座buf[HB\U PKT\U日期\U时间]@Rohit是的,这相当于我答案中的代码-这个答案仍然有endianness解码错误的方式。@Rohit可能工作得很好,直到你碰巧有一个大于0x7F的字节值。当然,
无符号字符
将被提升为
\u unsigned\uuuu int
?并且在这两种情况下都不会导致崩溃。好的,澄清-由于
0-0xff
都适合
int
,因此它确实会被提升为
int
,而不是
uint
,但这不会导致符号扩展。由此产生的
int
仍将具有范围
0-0xff
@Alnitak。它将被提升为int,而不是无符号int>(C116.3.1.1)。如果int为32位,则基本上会得到以下代码:
int32\t my\u int=0xFF;my\u int right-最顶端的位可能会丢失(取决于实现)。
mypkt.dateTime = (long) ( ( socket_buf[0] << 24) |  (socket_buf[1] << 16) |  socket_buf[2] << 8) | (socket_buf[3] << 0));
mypkt.dateTime = ((socket_buf[0] <<  0) +
                  (socket_buf[1] <<  8) + 
                  (socket_buf[2] << 16) +
                  ((uint32_t)socket_buf[3] << 24));
mypkt.dateTime = ( ((uint32_t)socket_buf[0] << 24) |
                   ((uint32_t)socket_buf[1] << 16) |
                   ((uint32_t)socket_buf[2] <<  8) |
                   ((uint32_t)socket_buf[3] <<  0) );