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;
}

Linux网络编程--字节序的更多相关文章

  1. linux网路编程:字节序(大端、小端、网络、主机)

    字节序:就是数据在内存中的存放顺序,也可称之为端模式. 大端模式和小端模式的定义 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端. 2) Big-End ...

  2. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  3. Linux 网络编程基础(1)--网络相关的数据结构及转化函数

    在Linux下进行网络编程,使用的语言一般为C.就个人感受而言,在Linux下进行网络程序的编写,重要的不是代码能力要多强,而是对Linux的网络编程思想的理解和对Linux网络数据结构的掌握.如果想 ...

  4. 服务器编程入门(4)Linux网络编程基础API

      问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字( ...

  5. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  6. Proxy源代码分析——谈谈如何学习Linux网络编程

    Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...

  7. 很全的linux网络编程技巧

    本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...

  8. Linux网络编程案例分析

    本代码来自于博主:辉夜星辰 本篇主要对运行代码中出现的问题进行分析,代码本身的内容后续展开讨论. 服务器端代码 /* Linux网络编程之TCP编程,服务器端读数据 socket函数之后,返回值ser ...

  9. 第5章 Linux网络编程基础

    第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...

随机推荐

  1. 删除小脚本 srm

    提示:只能删除当前路径下的目录或文件 #!/bin/bash #将测试好的脚本,拷贝到 $PATH 能够搜索到目录下.并且改名 例如: /usr/local/bin cp /test/srm.sh / ...

  2. python3+opencv+tkinter开发简单的人脸识别小程序

    学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...

  3. 杭电 HDU ACM 2795 Billboard(线段树伪装版)

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. android-Animation进阶(创造用户舒服的动画)

    android中经常使用的动画有Animation ,Animator两种; ---第1种经常使用的是使用在Activity切换中.比方打开一个Activity.关闭一个Activity 个人比較喜欢 ...

  5. JVM-java字符编码

    在JVM内部,所有的字符都是用Unicode编码的.而对于JVM所在操作系统的文件系统,可能有不同的编码类型. 由于JVM和OS文件系统所使用的编码方式不同,JVM在与操作系统进行数据交互的时候,就会 ...

  6. thinkphp使后台的字体图标显示异常

    thinkphp使后台的字体图标显示异常 相似问题 1.thinkPHP的这些图标都不显示了-CSDN论坛https://bbs.csdn.net/topics/391823415 解答: 发现在别的 ...

  7. POJ 1636 DFS+DP

    思路: 先搜索出来如果选这个点 其它哪些点必须选 跑个背包就好了 //By SiriusRen #include <cstdio> #include <cstring> #in ...

  8. Debian9.5 VNC Server远程桌面配置

    VNC概述 VNC (Virtual Network Console)是虚拟网络控制台的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 ...

  9. VNC CentOS Linux下VNC Server远程桌面配置详解

    VNC概述 VNC (Virtual Network Console)是虚拟网络控制台的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 ...

  10. WebAssembly学习(四):AssemblyScript - 结构体系与内置函数

    一.结构体系 1.编译 编译器的结构相对保守. 提供源文件,其文本被标记化并解析为抽象语法树. 这里执行语法级检查. 一旦解析了所有引用的源文件,就构造一个程序并从AST初始化. 在这里进行合理性检查 ...