关于字节大小端

来自libhv的检验字节大小端的方法 https://github.com/ithewei/libhv/blob/master/base/hendian.h

static inline int detect_endian() {
    union {
        char c;
        short s;
    } u;
    u.s = 0x1122;
    return u.c ==0x11 ? BIG_ENDIAN : LITTLE_ENDIAN;
}

  • char字符存储空间为一个字节,
  • 16进制的每个字符需要用4位二进制位来表示,,0x0为0000,0xf为1111,即1个16进制数为4位,
  • 如42 4D 38 04 04 00 00 00 00 00 36 04 00 00,每两个16进制数隔开,用意是:因为1个16进制数为4位,两个就是8位,即1个字节,所以这里是14字节,,以字节为单位,容易计数
  • BEFORE DECODE (16 bytes) AFTER DECODE (13 bytes)
  • +------+--------+------+----------------+ +------+----------------+
  • | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content |
  • | 0xCA | 0x000C | 0xFE | "HELLO, WORLD" | | 0xFE | "HELLO, WORLD" |
  • +------+--------+------+----------------+ +------+----------------+
字符 16进制 字节 关系 - 哈哈呵h - 博客园

这里对1个16进制数为什么是半个字节,2个16进制数是1个字节,解释得很透彻。


[https://www.cnblogs.com/52php/p/6114643.html](https://www.cnblogs.com/52php/p/6114643.html)
```c
#include <stdio.h>
#include <stdbool.h>
 
union {
    int number;
    char s;
} test;
 
bool testBigEndin() {
    test.number = 0x01000002;
    return (test.s == 0x01);
}
 
int main(int argc, char **argv) {
    if (testBigEndin()) {
        printf("big");
    } else {
        printf("small");
    }
}

这里给了一个判断大小端而没用指针的方法。

#include <stdio.h>
int main (void)
{
	short i = 0x1122;
	char *a = (char*)(&i);
	printf ("0x%x\n", *(a + 0)); //大端为 0x11 小端为 0x22
	printf ("0x%x\n", *(a + 1));
	return 0;
}
输出结果:
0x22
0x11

低位低地址,高位高地址。
从数组角度讲,a0是低地址,a1是高地址。

#include <stdio.h>
int main (void)
{
	union
	{
		short i;
		char a[2];
	}u;
	u.a[0] = 0x11;
	u.a[1] = 0x22;
	printf ("0x%x\n", u.i);  //0x2211 为小端  0x1122 为大端
	return 0;
}
输出结果:
0x2211

关于指针强制转换

#include<stdio.h>
int main(){
    
    
    
    
    return 0;
}
posted @ 2022-12-01 15:39  lingr7  阅读(73)  评论(0编辑  收藏  举报