繁体   English   中英

uint16_t在char数组中

[英]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值中生成intunsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM