首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >焦炭数组中的uint16_t

焦炭数组中的uint16_t
EN

Stack Overflow用户
提问于 2016-04-09 09:38:41
回答 1查看 2.6K关注 0票数 1

对于一个学校项目,我必须在C中开发一个TFTP服务器,我必须在这样的字符数组中构建一个数据包:

代码语言:javascript
复制
 2 bytes    2 bytes    n bytes
+--------+-----------+--------+
|  CODE  |  Block #  |  Data  |
+--------+-----------+--------+

下面是我如何构建这个包:

代码语言:javascript
复制
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;
}

此函数使用数据包内容填充buffer,并用数据包大小填充length。如果block低于128,则工作正常。如果它比128还要高,它就变成-128。

你能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-09 09:49:00

除非某物只有一个字节大小,否则不能将其分配给*buffer。这两项作业都是不正确的:

代码语言:javascript
复制
*(buffer) = DATA;
*(buffer + *length) = block;

编写uint16_t时,请使用memcpy

代码语言:javascript
复制
uint16_t dataToWrite = ...;
memcpy(buffer + *length, &dataToWrite, sizeof(uint16_t));

您还没有完成,因为您需要决定如何分配dataToWrite。如果你这么做

代码语言:javascript
复制
uint16_t dataToWrite = block;

通过线路发送的数据将按硬件特定的顺序发送,这是不应该发生的。相反,您需要使用-family functions之一将您的号码转换为网络格式:

代码语言:javascript
复制
uint16_t dataToWrite = htons(block);

我在同一台机器上检查 printf(“块:%d\n",包大小(Uint_16));

这是不正确的,原因与赋值相同:packet[sizeof(uint_16)]从存储在位置sizeof(uint_16)char/uint8_t值生成一个intunsigned int,并且它也忽略了另一个字节。

要解决这个问题,您需要再次使用memcpy。当然,如果在编写方面使用htons,则需要在打印之前使用ntohs

代码语言:javascript
复制
uint16_t dataToPrint;
memcpy(dataToPrint, &packet[sizeof(uint16_t)], sizeof(uint16_t));
dataToPrint = ntohs(dataToPrint);
printf("block : %u\n", dataToPrint);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36515085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档