Я использую C для чтения файла изображения .png
, и если вы не знакомы с форматом кодирования PNG
, полезные целочисленные значения кодируются в файлах .png
в виде 4-байтовых целых чисел с прямым порядком байтов.
Мой компьютер - это машина с прямым порядком байтов, поэтому для преобразования из прямого порядка байтов uint32_t
, который я прочитал из файла с fread()
, в формат с прямым порядком байтов, который понимает мой компьютер, я использовал эту небольшую функцию, которую я написал:
#include <stdint.h>
uint32_t convertEndian(uint32_t val){
union{
uint32_t value;
char bytes[sizeof(uint32_t)];
}in,out;
in.value=val;
for(int i=0;i<sizeof(uint32_t);++i)
out.bytes[i]=in.bytes[sizeof(uint32_t)-1-i];
return out.value;
}
Это прекрасно работает в моей среде x86_64 UNIX, gcc
компилируется без ошибок или предупреждений даже с флагом -Wall
, но я уверен, что полагаюсь на поведение undefined и каламбур, которые могут не работать так же хорошо в других системах.
Есть ли стандартная функция, которую я могу вызвать, которая может надежно преобразовать целое число с прямым порядком байтов в то, что понимает собственная машина, или, если нет, есть ли альтернативный более безопасный способ сделать это преобразование?
htonl()
иntohl()
? - person Fred Larson   schedule 21.05.2020ntohl()
- person Barmar   schedule 21.05.2020arpa/inet.h
, который недоступен в системах, отличных от UNIX. - person Willis Hershey   schedule 21.05.2020uint8_t bytes
вместоchar bytes
. На редких машинах, гдеchar
не 8 бит, код не компилируется, а не компилируется и выполняется неправильно. - person chux - Reinstate Monica   schedule 21.05.2020convertEndian()
выполняет обратный порядок байтов, а не преобразует целое число с прямым порядком байтов в единицу на собственной машине. Я ожидал, чтоbig_to_host32()
будет лучшим подходом. - person chux - Reinstate Monica   schedule 21.05.2020ntohl()
подразумевает от сети до длинной, но сеть подразумевает большой, даже если в каком-то подключенном сетевом протоколе используется прямой порядок байтов, а длинный подразумевает 32-битный, даже еслиlong
64-битный. Мне нравятся такие, какbe32toh()
больше. - person chux - Reinstate Monica   schedule 22.05.2020