The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Переносимое использование типов а-ля int64_t"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Переносимое использование типов а-ля int64_t"  
Сообщение от scons on 15-Ноя-06, 08:13 
Нужно писать/читать бинарные данные так, чтобы они были переносимы между любыми системами. Соответственно, нужны целые типы с фиксированной длиной и функции для endian преобразований. Что лучше использовать?

Как я понимаю, #include <sys/endian.h> и оттуда типы __uintXX_t, и макросы htobeXX, htoleXX, beXXtoh, leXXtoh. Это есть у меня на FreeBSD. Есть ли это везде? Или лучше hton/ntoh? Там, правда, нет 64 бит, но при желании я могу без них обойтись.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Переносимое использование типов а-ля int64_t"  
Сообщение от pup (ok) on 15-Ноя-06, 19:48 
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 придётся чуть иначе играть... но принцип я изложил. ;)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Переносимое использование типов а-ля int64_t"  
Сообщение от scons on 15-Ноя-06, 20:27 
>с signed придётся чуть иначе играть... но принцип я изложил. ;)
Смахивает на кривой велосипед. К слову, есть сдвиги и битовые операции :)
Собственно, вопрос был о безопасности использования sys/endian.h.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Переносимое использование типов а-ля int64_t"  
Сообщение от pup (ok) on 16-Ноя-06, 07:11 
>>с signed придётся чуть иначе играть... но принцип я изложил. ;)
>Смахивает на кривой велосипед. К слову, есть сдвиги и битовые операции :)

угу, есть битовые операции... но я, честно говоря, на практике с hi-endian тачкой не сталкивался, не понимаю как такое может работать и, поэтому, предпочёл перестраховаться, уйдя от битов/байтов далеко-далеко =)
а оптимизацией пускай компилятор занимается.

>Собственно, вопрос был о безопасности использования sys/endian.h.

точно-точно. это я забыл совсем упомянуть что переносимости в этом использовании не много. в линухах, например, этого файлика нету.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Переносимое использование типов а-ля int64_t"  
Сообщение от scons on 16-Ноя-06, 19:13 
>угу, есть битовые операции... но я, честно говоря, на практике с hi-endian
>тачкой не сталкивался, не понимаю как такое может работать и, поэтому,
>предпочёл перестраховаться, уйдя от битов/байтов далеко-далеко =)
>а оптимизацией пускай компилятор занимается.
младшие биты остаются младшими битами, вне зависимости от того, как они хранится. Поэтому (& 0xff) и (>> 8)

>>Собственно, вопрос был о безопасности использования sys/endian.h.
>точно-точно. это я забыл совсем упомянуть что переносимости в этом использовании не
>много. в линухах, например, этого файлика нету.
Действительно. Значит, рулят htonl/ntohl и uint_32_t.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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