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. Linux学习-Ubuntu 18.04-安装图文教程

    Ubuntu(友帮拓.优般图.乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球 ...

  2. svn 学习

    svn命令在linux下的使用 svn命令在linux下的使用SVN软件版本管理 1.将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn che ...

  3. HTML学习----------DAY1 第一节

    什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...

  4. 《JSP+Servlet+Tomcat应用开发从零開始学》

    当当网页面:  http://product.dangdang.com/23619990.html 内容简单介绍      本书全面介绍了 JSP开发中涉及的相关技术要点和实战技巧. 全书结构清晰,难 ...

  5. HDU 4462 Scaring the Birds (暴力枚举DFS)

    题目链接:pid=4462">传送门 题意:一个n*n的区域,有m个位置是能够放稻草人的.其余都是玉米.对于每一个位置(x,y)所放稻草人都有个作用范围ri, 即abs(x-i)+ab ...

  6. .Net 安装aliyun-oss

    NuGet安装 如果您的Visual Studio没有安装NuGet,请先安装 NuGet. 安装好NuGet后,先在Visual Studio中新建或者打开已有的项目,然后选择工具 > NuG ...

  7. CSS的水平居中和垂直居中解决方案

    在写CSS样式的时候,有时为了美观,会添加水平居中和垂直居中,这时候你有可能会遇到很棘手的问题,有些水平居中和垂直居中的属性添加上去完全没反应,下面给大家列举一些CSS水平居中和垂直居中的终极解决方案 ...

  8. 第一次接触正则表达式/^[A-Za-z_][A-Za-z0-9_]{5,15}$/

    /^[A-Za-z_][A-Za-z0-9_]{5,15}$/ /^$/ :完整表达式 ^ :表示以什么开始,或者取反 $ :结束 ^[A-Za-z_] : 以字母开始,无论大小都可以: [^A-Za ...

  9. 基于CANopen DSP402的运动控制笔记

    常用的mode of operation 有以下几种: 控制字 control word: 6--------------7---------------15--------------------7 ...

  10. [Chromium文档转载,第003章]Proposal: Mojo Synchronous Methods

    Proposal: Mojo Synchronous Methods yzshen@chromium.org 02/02/2016 Overview Currently there are quite ...