做过socket 一、字节序定义字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序。其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。一次Sun SPARC 在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian a) Little-Endian b) Big-Endian c) 二、高/ ----------------------- 。。。。。。 | . . 栈顶 ----------------------- | | NULL ( /|\ ----------------------- 堆 ----------------------- 未初始化的数据 ---------------------- ( 初始化的数据 ----------------------- 正文段( ----------------------- 以上图为例如果我们在栈上分配一个unsigned char buf[4] 栈底(高地址) ---------- buf[3] buf[2] buf[1] buf[0] ---------- 栈顶(低地址) 现在我们弄清了高低地址,接着我来弄清高/ 高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian 以unsigned int value = 0x12345678 Big-Endian: 栈底(高地址) --------------- buf[3] (0x78) -- buf[2] (0x56) buf[1] (0x34) buf[0] (0x12) -- --------------- 栈顶(低地址) Little-Endian: 栈底(高地址) --------------- buf[3] (0x12) -- buf[2] (0x34) buf[1] (0x56) buf[0] (0x78) -- --------------- 栈顶(低地址) 在现有的平台上Intel 三、网络字节序的转换假设对于little endian #include <stdio.h> struct ST{ short val1; short val2; }; union U{ int val; struct ST st; }; int main(void) { int a = 0; union U u1, u2; a = 0x12345678; u1.val = a; printf("u1.val is 0x%x\n", u1.val); printf("val1 is 0x%x\n", u1.st.val1); printf("val2 is 0x%x\n", u1.st.val2); printf("after first convert is: 0x%x\n", htonl(u1.val)); u2.st.val2 = htons(u1.st.val1); u2.st.val1 = htons(u1.st.val2); printf("after second convert is: 0x%x\n", u2.val); return 0; } 输出结果: u1.val is 0x12345678 val1 is 0x5678 val2 is 0x1234 after first convert is: 0x78563412 after second convert is: 0x78563412 按照这种想法我们实现long long int 代码如下: #include <stdio.h> struct ST{ int val1; int val2; }; union test { long long int val; struct ST st; }; int main(void) { long long int a; union test u1, u2; a = 0x7654321087654321LL; u1.val = a; u2.st.val2 = htonl(u1.st.val1); u2.st.val1 = htonl(u1.st.val2); printf("val1 is 0x%x\n", u2.st.val1); printf("val2 is 0x%x\n", u2.st.val2); printf("u1.val is : 0x%llx\n", u1.val); printf("after convert is : 0x%llx\n", u2.val); return 0; } 执行结果: val1 is 0x10325476 val2 is 0x21436587 u1.val is : 0x7654321087654321 after convert is : 0x2143658710325476 另外注意long long int 想看数据在内存中如何存储的,就用gdb |
|