В своем вопросе вы указали, что хотите преобразовать пользовательский ввод из 175 в 00000000 00000000 00000000 10101111
, то есть порядковый номер байта , также известный как сетевой порядок байтов .
A в основном переносимый способ преобразования вашего целого без знака в массив без знака с прямым порядком байтов, как вы и предполагали из приведенного вами примера "175", заключался бы в использовании функции C htonl()
(определено в заголовке <arpa/inet.h>
в системах Linux) для преобразования вашего unsigned int в порядок байтов с прямым порядком байтов, затем используйте memcpy()
(определено в заголовке <string.h>
для C, <cstring>
для C ++), чтобы скопировать байты вваш массив char (или unsigned char).
Функция htonl()
принимает 32-разрядное целое число без знака в качестве аргумента (в отличие от htons()
, который принимает без знака)16-разрядное целое число) и преобразует его в сетевой байтовый порядок из байтового порядка хоста (отсюда аббревиатура Host TO Network Long, вместо Host TO Network Short для htons
), возвращая результат в виде 32-разрядного целого числа без знака.Целью этого семейства функций является обеспечение того, чтобы все сетевые соединения происходили в порядке байтов с прямым порядком байтов, чтобы все машины могли взаимодействовать друг с другом через сокет без проблем с порядком байтов.(Кроме того, для машин с прямым порядком байтов функции htonl()
, htons()
, ntohl()
и ntohs()
, как правило, компилируются так, чтобы они были просто 'no op', потому что байты не нужно переворачиватьпрежде чем они будут отправлены или получены из сокета, поскольку они уже находятся в правильном порядке байтов)
Вот код:
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
int main() {
unsigned int number = 175;
unsigned int number2 = htonl(number);
char numberStr[4];
memcpy(numberStr, &number2, 4);
printf("%x %x %x %x\n", numberStr[0], numberStr[1], numberStr[2], numberStr[3]);
return 0;
}
Обратите внимание, что, как сказал caf, вы должныпечатать символы как без знака , используя спецификатор формата printf %x
.
Приведенный выше код печатает 0 0 0 af
на моем компьютере (компьютере x86_64, который использует порядок байтов с прямым порядком байтов), которыйшестнадцатеричное для 175.