1

背景

我正在创建一个简单的 BOOTP/DHCP 服务器,并且正在努力创建一些数据包字节 - 特别是 DHCP 选项 13,FileSize。

规范声明该选项的总长度为 64 字节 => 1 字节用于 ID (13),1 字节用于数据长度,其余字节为数据 OR 0。

问题

我需要将 int 值 14236 表示为我的数据,相当于十六进制的 379C,但这需要分布在 2 个字节的数据中。如何获取 int 并获取数据的 char[]?

4

4 回答 4

4

它可能需要按网络字节顺序排列。如果是这样,那么您可以使用htons. 如果你想要它在后两个字节中:

char buffer[4];
buffer[0] = 13;   // code
buffer[1] = 2;    // length
*(uint16_t*)(buffer + 2) = htons( 14236 );
于 2011-12-08T15:30:51.250 回答
3

您可以使用以下代码:

int size;
assert(size < 0x10000);

unsigned char twoBytes[];
twoBytes[0] = size & 0xFF;
twoBytes[1] = size >> 8;
于 2011-12-08T15:30:49.520 回答
1
int size = 14236;
unsigned char bytes[2] = { (size >> 8) & 0xff, size & 0xff };

printf("%x%x", bytes[0], bytes[1]);

注意:您需要确保这两个字节按网络顺序放置在数组中,如果我没记错的话就是大端。

于 2011-12-08T15:29:07.367 回答
0

所以,你有数据包:

unsigned char optionBytes[64];

然后设置 ID 和数据长度:

optionBytes[0] = 13;
optionBytes[1] = 2;

最后,计算值的高字节和低字节:

optionBytes[2] = 14236 / 256;
optionBytes[3] = 14236 % 256;

这假设您希望以“big-endian”格式表示数据,较低偏移量的值更有价值。

于 2011-12-08T15:33:34.477 回答