Как преобразовать 64-битное int в двоичное представление? - PullRequest
4 голосов
/ 18 августа 2011

Как преобразовать 64-битное int в двоичное представление (big endian)?Для обратного задания я использую следующие функции:

int readInt (struct str *buf) {
    buf -> cur_len = buf -> cur_len + 4;
    return 
    (((buf -> data[buf -> cur_len - 3 ] & 0xff) << 24) | 
    ((buf -> data[buf -> cur_len - 2 ] & 0xff) << 16) |
    ((buf -> data[buf -> cur_len - 1 ] & 0xff) <<  8) |
    ((buf -> data[buf -> cur_len ] & 0xff) <<  0));
};


long unsigned int 32Bit(struct str *buf) {  // 32
    return ((long unsigned int)readInt(buf)) & 0xffffffffL;
};

long unsigned int 64Bit(struct str *buffer) { //64
    long unsigned int result = 32Bit(buf);
    result *= 4294967296.0;
    return result;
}

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

Сериализация 64-битного числа без знака в массиве unsigned char с сохранением 8 битов в каждом в порядке с прямым порядком байтов может быть выполнена следующим образом:

void serialise_64bit(unsigned char dest[8], unsigned long long n)
{
    dest[0] = (n >> 56) & 0xff;
    dest[1] = (n >> 48) & 0xff;
    dest[2] = (n >> 40) & 0xff;
    dest[3] = (n >> 32) & 0xff;
    dest[4] = (n >> 24) & 0xff;
    dest[5] = (n >> 16) & 0xff;
    dest[6] = (n >>  8) & 0xff;
    dest[7] = (n >>  0) & 0xff;
}
2 голосов
/ 18 августа 2011

Вы не должны использовать встроенные типы для сериализации;вместо этого, когда вам нужно знать точный размер типа, вам нужны типы с фиксированной шириной:

#include <stdint.h>

unsigned char buf[8]; // 64-bit raw data

uint64_t little_endian_value =
   (uint64_t)buf[0] + ((uint64_t)buf[1] << 8) + ((uint64_t)buf[2] << 16) + ... + ((uint64_t)buf[7] << 56);

uint64_t big_endian_value =
   (uint64_t)buf[7] + ((uint64_t)buf[6] << 8) + ((uint64_t)buf[5] << 16) + ... + ((uint64_t)buf[0] << 56);

Аналогично для 32-битных значений используйте uint32_t там.Убедитесь, что ваш исходный буфер использует без знака символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...