long long 类型的网络字节顺序转换
来源:百度文库 编辑:神马文学网 时间:2024/05/25 10:00:50
做过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
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
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
long long 类型的网络字节顺序转换
int long 字节数
long
怎么样读取long raw类型的字段
Oracle中的long类型
C++中的long long和__int64类型
将long类型的值存入char类型数组里面
C++中的long long和__int64类型(多平台移植)
long long way to go
《长尾(The Long Tail)》的完整中译版
《长尾(The Long Tail)》的完整中译版
《长尾(The Long Tail)》的完整中译版
请问oracle里面的long,long raw,raw,clob,blob各有什么好处与...
her story is not long long ago
[精彩] 如何用sql把一个字段从long raw类型改为blob类型???
长尾 The Long Tail
Long Term Evolution, LTE
long和int区别
LONG TIME NO SEE
埃德温朗斯登龙Edwin Longsden Long
Long Tail的简短历史(1/5)
Long Tail的简短历史(2/5)
Long Tail的简短历史(3/5)
Long Tail的简短历史(4/5)