以小端或大端存储

问题描述 投票:0回答:2

我有点困惑我的两个函数是否正在检索字节并将字节存储到

char
数组中。

现在,在我的系统中,我将整数存储到我的

char
数组(
char *
)中。

我将它们分解成字节块,总共 4 个字节,因为我们要存储整数。

read_int
store_int
是小端还是大端?

编辑:刚刚意识到我一直在用大端阅读它,

我修改了我的代码,它现在是小尾数

看起来对吗?

void store_int(unsigned char* arr, int index, int value) {
    arr[index] = value & 0xFF;
    arr[index+1] = (value >> 8) & 0xFF;
    arr[index+2] = (value >> 16) & 0xFF;
    arr[index+3] = (value >> 24) & 0xFF;
}

// Read integer value in little endian byte order
int read_int(const unsigned char* arr, int index) {
    int value = 0;
    value |= ((int)arr[index+3]) << 24;
    value |= ((int)arr[index+2]) << 16;
    value |= ((int)arr[index+1]) << 8;
    value |= ((int)arr[index]);
    return value;
}

如果它是大端,我将如何重构为小端?

void store_int(unsigned char* arr, int index, int value) {
    arr[index] = (value >> 24) & 0xFF;
    arr[index+1] = (value >> 16) & 0xFF;
    arr[index+2] = (value >> 8) & 0xFF;
    arr[index+3] = value & 0xFF;
}

int read_int(const unsigned char* arr, int index) {
    int value = 0;
    value |= ((int)arr[index]) << 24;
    value |= ((int)arr[index+1]) << 16;
    value |= ((int)arr[index+2]) << 8;
    value |= ((int)arr[index+3]);
    return value;
}
c endianness
2个回答
1
投票
void store_uint32_be( unsigned char *arr, size_t *index, uint32_t value ) {
   arr[ (*index)++ ] = ( value >> 24 ) & 0xFF;
   arr[ (*index)++ ] = ( value >> 16 ) & 0xFF;
   arr[ (*index)++ ] = ( value >>  8 ) & 0xFF;
   arr[ (*index)++ ] = ( value >>  0 ) & 0xFF;
}

void store_uint32_le( unsigned char *arr, size_t *index, uint32_t value ) {
   arr[ (*index)++ ] = ( value >>  0 ) & 0xFF;
   arr[ (*index)++ ] = ( value >>  8 ) & 0xFF;
   arr[ (*index)++ ] = ( value >> 16 ) & 0xFF;
   arr[ (*index)++ ] = ( value >> 24 ) & 0xFF;
}

uint32_t read_uint32_be( const unsigned char *arr, size_t *index ) {
   return
       ( ( ( uint32_t )arr[ (*index)++ ] ) << 24
       | ( ( uint32_t )arr[ (*index)++ ] ) << 16
       | ( ( uint32_t )arr[ (*index)++ ] ) <<  8
       | ( ( uint32_t )arr[ (*index)++ ] ) <<  0
       );
}

uint32_t read_uint32_le( const unsigned char *arr, size_t *index ) {
   return
       ( ( ( uint32_t )arr[ (*index)++ ] ) <<  0
       | ( ( uint32_t )arr[ (*index)++ ] ) <<  8
       | ( ( uint32_t )arr[ (*index)++ ] ) << 16
       | ( ( uint32_t )arr[ (*index)++ ] ) << 24
       );
}

切换到

uint32_t
因为
int
可能太小,但更重要的是因为你的方法不适用于有符号数。

index
变成一个指针,使功能更加方便。例如,

char arr[ 12 ];
size_t index = 0
store_uint32_be( arr, &index, value1 );
store_uint32_be( arr, &index, value2 );
store_uint32_be( arr, &index, value3 );

0
投票

鉴于您将最重要的位存储在最低的数组索引中,您的函数是 big endian

<<24
提取 most 有效位,然后函数将它们分配给数组的最低索引。

要将它们转换为小端,您只需反转分配值的索引:

void store_int(unsigned char* arr, int index, int value) {
    arr[index+3] = (value >> 24) & 0xFF;
    arr[index+2] = (value >> 16) & 0xFF;
    arr[index+1] = (value >> 8) & 0xFF;
    arr[index] = value & 0xFF;
}

int read_int(const unsigned char* arr, int index) {
    int value = ((int)arr[index+3]) << 24; // To make the code more efficient you could initialize value to this directly
    value |= ((int)arr[index+2]) << 16;
    value |= ((int)arr[index+1]) << 8;
    value |= ((int)arr[index]);
    return value;
}
© www.soinside.com 2019 - 2024. All rights reserved.