Переносимое использование типов а-ля int64_t, scons, 15-Ноя-06, 08:13 [смотреть все]Нужно писать/читать бинарные данные так, чтобы они были переносимы между любыми системами. Соответственно, нужны целые типы с фиксированной длиной и функции для endian преобразований. Что лучше использовать?Как я понимаю, #include <sys/endian.h> и оттуда типы __uintXX_t, и макросы htobeXX, htoleXX, beXXtoh, leXXtoh. Это есть у меня на FreeBSD. Есть ли это везде? Или лучше hton/ntoh? Там, правда, нет 64 бит, но при желании я могу без них обойтись. |
- Переносимое использование типов а-ля int64_t, pup, 19:48 , 15-Ноя-06 (1)
int write_uint64 (int fd, long long unsigned val) { unsigned char arr[8]; int i; for (i = 0; i < 8; i ++) { arr[i] = val % 0x100; val /= 0x100; } return write (fd, arr, 8); } int read_uint64 (int fd, long long unsigned *val) { unsigned char arr[8]; int i; int ret; if ((ret = read (fd, arr, 8)) != 8) return ret; *val = 0; for (i = 7; i >= 0; i --) { *val *= 0x100; *val += arr[i]; } return ret; } с signed придётся чуть иначе играть... но принцип я изложил. ;)
- Переносимое использование типов а-ля int64_t, scons, 20:27 , 15-Ноя-06 (2)
>с signed придётся чуть иначе играть... но принцип я изложил. ;) Смахивает на кривой велосипед. К слову, есть сдвиги и битовые операции :) Собственно, вопрос был о безопасности использования sys/endian.h.
- Переносимое использование типов а-ля int64_t, pup, 07:11 , 16-Ноя-06 (3)
>>с signed придётся чуть иначе играть... но принцип я изложил. ;) >Смахивает на кривой велосипед. К слову, есть сдвиги и битовые операции :) угу, есть битовые операции... но я, честно говоря, на практике с hi-endian тачкой не сталкивался, не понимаю как такое может работать и, поэтому, предпочёл перестраховаться, уйдя от битов/байтов далеко-далеко =) а оптимизацией пускай компилятор занимается. >Собственно, вопрос был о безопасности использования sys/endian.h. точно-точно. это я забыл совсем упомянуть что переносимости в этом использовании не много. в линухах, например, этого файлика нету.
- Переносимое использование типов а-ля int64_t, scons, 19:13 , 16-Ноя-06 (4)
>угу, есть битовые операции... но я, честно говоря, на практике с hi-endian >тачкой не сталкивался, не понимаю как такое может работать и, поэтому, >предпочёл перестраховаться, уйдя от битов/байтов далеко-далеко =) >а оптимизацией пускай компилятор занимается. младшие биты остаются младшими битами, вне зависимости от того, как они хранится. Поэтому (& 0xff) и (>> 8)>>Собственно, вопрос был о безопасности использования sys/endian.h. >точно-точно. это я забыл совсем упомянуть что переносимости в этом использовании не >много. в линухах, например, этого файлика нету. Действительно. Значит, рулят htonl/ntohl и uint_32_t.
|