1 .谈到字节序,那么会有朋友问什么是字节序

非常easy:【比如一个16位的整数。由2个字节组成,8位为一字节,有的系统会将高字节放在内存低的地址上,有的则将低字节放在内存高的地址上,所以存在字节序的问题。】


2 .那么什么是高字节、低字节?

也相当简单:【一个16进制整数有两个字节组成,比如:0xA9。

高字节就是指16进制数的前8位(权重高的8位),如上例中的A。

低字节就是指16进制数的后8位(权重低的8位),如上例中的9。



大于一个字节的变量类型一般有两种表示方法:



比如:变量0xabcd在大端字节序和小端字节型系统中表示方法如图



我们用代码验证一下我们自己的系统是小端还是大端吧

#include <stdio.h>

/* 联合类型的变量类型。用于測试字节序
* 成员value的高低端字节能够由成员type按字节訪问
*/
typedef union{
unsigned short int value; /*短整型变量*/
unsigned char byte[2]; /*字符类型*/
}to; int main(int argc, char *argv)
{
to typeorder ; /*一个to类型变量*/
typeorder.value = 0xabcd; /* 将typeorder变量赋值为0xabcd */ /* 小端字节序检查 */
if(typeorder.byte[0] == 0xcd && typeorder.byte[1]==0xab){ /*低字节在前*/
printf("Low endian byte order"
"byte[0]:0x%x,byte[1]:0x%x\n",
typeorder.byte[0],
typeorder.byte[1]);
} /* 大端字节序检查 */
if(typeorder.byte[0] == 0xab && typeorder.byte[1]==0xcd){ /*高字节在前*/
printf("High endian byte order"
"byte[0]:0x%x,byte[1]:0x%x\n",
typeorder.byte[0],
typeorder.byte[1]);
} return 0;
}

3 .字节序转换函数介绍

字节序转换函数的使用:

#include <stdio.h>

/* 联合类型的变量类型,用于測试字节序
* 成员value的高低端字节能够由成员type按字节訪问
*/
/* 16位 */
typedef union{
unsigned short int value;
unsigned char byte[2];
}to16;
/* 32位 */
typedef union{
unsigned long int value;
unsigned char byte[4];
}to32; #define BITS16 16 /*16位*/
#define BITS32 32 /*32位*/
/* 依照字节打印,begin为字节開始,
* flag为BITS16表示16位,
* flag为BITS32表示32位。
*/
void showvalue(unsigned char *begin, int flag)
{
int num = 0, i = 0;
if(flag == BITS16){
num = 2;
}else if(flag == BITS32){
num = 4;
} for(i = 0; i< num; i++)
{
printf("%x ",*(begin+i));
}
printf("\n");
} int main(int argc, char *argv)
{
to16 v16_orig, v16_turn1,v16_turn2; /*一个to16类型变量*/
to32 v32_orig, v32_turn1,v32_turn2; /*一个to32类型变量*/ v16_orig.value = 0xabcd; /* 赋值为0xabcd */
v16_turn1.value = htons(v16_orig.value);/*第一次转换*/
v16_turn2.value = ntohs(v16_turn1.value);/*第二次转换*/ v32_orig.value = 0x12345678; /* 赋值为0x12345678 */
v32_turn1.value = htonl(v32_orig.value);/*第一次转换*/
v32_turn2.value = ntohl(v32_turn1.value);/*第二次转换*/ /* 打印结果 */
printf("16 host to network byte order change:\n");
printf("\torig:\t");showvalue(v16_orig.byte, BITS16); /* 16位数值的原始值 */
printf("\t1 times:");showvalue(v16_turn1.byte, BITS16); /* 16位数值的第一次转换后的值 */
printf("\t2 times:");showvalue(v16_turn2.byte, BITS16); /* 16位数值的第二次转换后的值 */ printf("32 host to network byte order change:\n");
printf("\torig:\t");showvalue(v32_orig.byte, BITS32); /* 32位数值的原始值 */
printf("\t1 times:");showvalue(v32_turn1.byte, BITS32); /* 32位数值的第一次转换后的值 */
printf("\t2 times:");showvalue(v32_turn2.byte, BITS32); /* 32位数值的第二次转换后的值 */ return 0;
}

最新文章

  1. qt中ui的 使用介绍
  2. JFinal 的初始化
  3. 编译原理简单语法分析器(first,follow,分析表)源码下载
  4. 用流从一个指定的网址抓取html代码
  5. 20145208 《Java程序设计》第5周学习总结
  6. Request.InputStream 接收Post Data
  7. dubbo管理控制台安装和使用
  8. 说说Audition消除歌曲中的人声
  9. PHP裁剪图片
  10. listview图片错位
  11. 使用vs自带的wcf配置工具
  12. SPOJ 1812 Longest Common Substring II(后缀自动机)
  13. Servlet的学习之web路径问题
  14. uip UDPclient模式通信移植,当地port随机
  15. 博客测试:博客系统i94web beta1.0 申请测试
  16. ionic入门之基本布局
  17. :after伪类+content内容生成
  18. [POJ 3581]Sequence
  19. PTA-栈
  20. DX9 DirectX 索引缓存(IndexBuffer) 代码

热门文章

  1. ssh 免交互式登陆
  2. eclipse下Tomcat7.0启动奔溃问题
  3. LicManager系统对各license类型终端客户机器的监控
  4. VS 2015支持C语言和C++程序
  5. 360动态加载的Android插件框架
  6. Spring MVC -- UEditor 编辑器整合入门
  7. vue的钩子函数
  8. XDoclet学习
  9. MVC:一个View显示多个Model(多个Model你可以使用ViewBag或ViewData , 或者:Model[&quot;myInfo&quot;] as)
  10. Codefroces 731C. Socks