Я чтение/запись в двоичный файл в формате мало-Endian от обратного порядка с использованием C и bswap_ {16,32,64} макросы из byteswap.h для байта -swapping.C 40 бит байт подкачки (обратный порядок байт)
Все значения считаются и записываются правильно, за исключением битового поля 40 бит.
Макрос bswap_40
не существует, и я не знаю, как это сделать или если возможно лучшее решение.
Вот небольшой код, показывающий эту проблему:
#include <stdio.h>
#include <inttypes.h>
#include <byteswap.h>
#define bswap_40(x) bswap_64(x)
struct tIndex {
uint64_t val_64;
uint64_t val_40:40;
} s1 = { 5294967296, 5294967296 };
int main(void)
{
// write swapped values
struct tIndex s2 = { bswap_64(s1.val_64), bswap_40(s1.val_40) };
FILE *fp = fopen("index.bin", "w");
fwrite(&s2, sizeof(s2), 1, fp);
fclose(fp);
// read swapped values
struct tIndex s3;
fp = fopen("index.bin", "r");
fread(&s3, sizeof(s3), 1, fp);
fclose(fp);
s3.val_64 = bswap_64(s3.val_64);
s3.val_40 = bswap_40(s3.val_40);
printf("val_64: %" PRIu64 " -> %s\n", s3.val_64, (s1.val_64 == s3.val_64 ? "OK" : "Error"));
printf("val_40: %" PRIu64 " -> %s\n", s3.val_40, (s1.val_40 == s3.val_40 ? "OK" : "Error"));
return 0;
}
Этот код компилируется с:
GCC -D_FILE_OFFSET_BITS = 64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE swap_40.c -o swap_40
Как определить макрос bswap_40
для чтения и записи этих значений 40 бит, выполняющих байты- замена?
Спасибо за решение, работать как шарм. –