![](/img/trans.png)
[英]Converting uint16_t to decimal and storing it in char array, bitwise. Error in retrieving the data in uint16_t variable
[英]uint16_t in array of char
对于一个学校项目,我必须在C中开发一个TFTP服务器。我必须在这样的char数组中构建一个数据包:
2 bytes 2 bytes n bytes
+--------+-----------+--------+
| CODE | Block # | Data |
+--------+-----------+--------+
以下是我构建此数据包的方法:
int tftp_make_data(char *buffer, size_t *length, uint16_t block, const char *data, size_t n) {
memset(buffer, 0, *length);
*length = 0;
*(buffer) = DATA;
*length += sizeof(uint16_t);
*(buffer + *length) = block;
*length += sizeof(uint16_t);
memcpy(buffer + *length, data, n);
*length += n;
return 0;
}
此函数使用数据包内容和填充length
填充buffer
并使用数据包的大小。 如果block
低于128,则此工作正常。如果它比128更好,则变为-128。
你能帮助我吗?
除非某个字节大小为一个字节,否则无法将其分配给*buffer
。 这两个分配都是不正确的:
*(buffer) = DATA;
*(buffer + *length) = block;
在编写uint16_t
,请使用memcpy
:
uint16_t dataToWrite = ...;
memcpy(buffer + *length, &dataToWrite, sizeof(uint16_t));
您还没有完成,因为您需要决定分配dataToWrite
。 如果你这样做
uint16_t dataToWrite = block;
通过线路发送的数据将按照特定于硬件的顺序进行,这种情况永远不会发生。 相反,你需要使用一个hton
-家庭功能到你的电话号码转换为网络格式:
uint16_t dataToWrite = htons(block);
我在同一台机器上检查它,只是
printf("block : %d\\n", packet[sizeof(uint_16)]);
这是不正确的,原因与赋值相同: packet[sizeof(uint_16)]
从存储在位置sizeof(uint_16)
的char
/ uint8_t
值中生成int
或unsigned int
,并且它也忽略另一个字节。
要解决此问题,您需要再次使用memcpy
。 当然,如果您在书写方面使用了htons
,则需要在打印前使用ntohs
:
uint16_t dataToPrint;
memcpy(dataToPrint, &packet[sizeof(uint16_t)], sizeof(uint16_t));
dataToPrint = ntohs(dataToPrint);
printf("block : %u\n", dataToPrint);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.