来自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;
}
标签:00,字节,16,int,char,关于,大小,进制
From: https://www.cnblogs.com/lingr7/p/16941623.html