The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Переносимое использование типов а-ля 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.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру