Конвертировать int 14236 в гекс 379C как char [37,9C] в C ++ - PullRequest
1 голос
/ 08 декабря 2011

Фон

Я создаю простой сервер BOOTP / DHCP, и я борюсь с созданием некоторых байтов пакета - в частности, опция DHCP 13, FileSize.

В спецификации указывается, что параметр имеет общую длину 64 байта => 1 байт для идентификатора (13), 1 байт для длины данных и оставшиеся байты в качестве данных ИЛИ 0.

Задача

Мне нужно выразить значение int 14236 в качестве моих данных, что равно 379C в HEX, но это должно быть распределено по 2 байтам данных. Как мне взять int и получить char [] данных?

Ответы [ 4 ]

4 голосов
/ 08 декабря 2011

Вероятно, он должен быть в сетевом порядке байтов. Если это так, то вы можете использовать htons. Если вы хотите это во вторых двух байтах:

char buffer[4];
buffer[0] = 13;   // code
buffer[1] = 2;    // length
*(uint16_t*)(buffer + 2) = htons( 14236 );
3 голосов
/ 08 декабря 2011

Вы можете использовать этот код:

int size;
assert(size < 0x10000);

unsigned char twoBytes[];
twoBytes[0] = size & 0xFF;
twoBytes[1] = size >> 8;
1 голос
/ 08 декабря 2011
int size = 14236;
unsigned char bytes[2] = { (size >> 8) & 0xff, size & 0xff };

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

Будьте осторожны: Вы должны убедиться, что два байта размещены в массиве в сетевом порядке, что, если я не ошибаюсь, является прямым порядком байтов.

0 голосов
/ 08 декабря 2011

Итак, у вас есть пакет:

unsigned char optionBytes[64];

Затем вы устанавливаете ID и длину данных:

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

И, наконец, вычисляем верхний и нижний байты вашего значения:

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

Предполагается, что вы хотите, чтобы данные были представлены в формате "с прямым порядком байтов", при этом значения с меньшим смещением стоят больше.

...