我有点困惑我的两个函数是否正在检索字节并将字节存储到
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;
}
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 );
鉴于您将最重要的位存储在最低的数组索引中,您的函数是 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;
}