"大端"和"小端"这两个术语的由来据说源于《格列佛游记》(Gulliver's Travels)一书,作者是爱尔兰作家乔纳森·斯威夫特(Jonathan Swift),书中描绘了两个敌对国家之间的争议,该争议起源于吃蛋的方式。
字节序分为大端字节序(big endian)和小端字节序(little endian).
大端(Big Endian)和小端(Little Endian)是用于描述在存储器中存储多字节数据时字节顺序的两种不同方法。
1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11
最近在从头重写 MobileIMSDK 的TCP版,自已组织TCP数据帧时就遇到了字节序大小端问题。所以,借这个机会单独整理了这篇文章,希望能加深大家对字节序问题的理解,加强对IM这种基于网络通信的程序在数据传输这一层的知识掌控情况。
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)
我一直都不理解,为什么要有大小端区分,尤其是小端,总是会忘记,因为他不符合人类的思维习惯,但存在即为合理,存在就有他存在的价值。这里有一个比较合理的解释:计算机中电路优先处理低位字节,效率比较高,因为计算机都是从低位开始的,所以计算机内部处理都是小端字节序。但是我们平常读写数值的方法,习惯用大端字节序,所以除了计算机的内部,其他场景大都是大端字节序,比如:网络传输和文件储存时都是用的大端字节序。
在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。
而TCP/IP协议栈使用大端字节序。应用程序交换格式化数据时,字节序问题就会出现。对于TCP/IP,地址用网络字节序来表示,所以应用程序有时需要在处理器的字节序与网络字节序之间转换它们。
字节序按类别分两种,一种是小端(Little Endian),另一种是大端(Big Endian)。 (1)小端字节序,指一个单元在计算机中存放时按照低位在低地址,高位在高地址的模式存放; (2)大端字节序,指一个单元在计算机中存放时按照低位在高地址,高位在低地址的模式存放。
IPv4套接字地址结构 POSIX规范只要求3个字段:sin_family、sin_addr和sin_port。 #include <netinet/in.h> struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; ... }; 通用套接
Socket中文意思是"插座",在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。
在计算机领域,大小端(Endianness)是指字节序的排列顺序。简单来说,就是存储器中多字节数据的字节序列,从高到低或从低到高的顺序不同。那么,何谓大小端呢?
一开始是由于不同架构的CPU处理多个字节数据的顺序不一样,比如x86的是小段模式,KEIL C51是大端模式。但是后来互联网流行,TCP/IP协议规定为大端模式,为了跨平台通信,还专门出了网络字节序和主机字节序之间的转换接口(ntohs、htons、ntohl、htonl)
在linux中,一切都是文件,所有文件都有一个int类型的编号,称为文件描述符。服务端和客户端通信本质是在各自机器上创建一个文件,称为socket(套接字),然后对该socket文件进行读写。
字节序,又称端序或尾序(英语中用单词:Endianness 表示),在计算机领域中,指电脑内存中或在数字通信链路中,占用多个字节的数据的字节排列顺序。
sin_family: 每种协议族使用的地址族均不同,IPv4使用4字节地址族,IPv6使用16字节地族。
C的整型算数运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的**字符和短整型操作数( char 属于整型家族 )**在使用之前被转换为普通整型,这种转换称为整型提升。
本文主要通过对JavaScript中数字数据与二进制数据之间的转换,让读者能够了解在JavaScript中如何对数字类型(包括但不限于Number类型)进行处理。
1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口。TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间。用户空间的程序需要通过套接字来访问内核网络协议栈。 套接口是全双工的通信,它不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。 套接字还可以异构系统间进行通信,异构系统指的是在硬件或软件上有所差别的系统,例如安卓系统的手机与windows系统的PC机上都可以实现QQ通信,套接字可以实现在这两个设备上的通信。 2.
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
注意:必须是小端格式 ‘\xC8\xCE\xC5\x06’ * 4 加上 \xCC\xCE\xC5\x06 刚好是 0x21DD09EC,所以利用成功。
在跨平台和网络编程中我们经常会提到网络字节序和主机字节序,如果没有正确对两者进行转换,从而导致两方产生了不同的解释,就会出现意想不到的bug。
最近基于MFC对话框,编写一个字节转码小工具(数值与字节码的相互转换,包括大小端和swap形式,数据包括整型、浮点型数据)。在使用串口、网络通信、嵌入式软件开发时,大小端字节序和Byte Swap是很常见的事情,许多工具软件诸如Modbus Poll和Modbus Slave都提供了数值(short,unsigned short,int, unsigned int,long long,unsigned long long,float,double等数值)的4种表示方式:Big-endian(大端)、Little-endian(小端)、Big-endian byte swap、Little-endian byte swap。如下图所示,Modbus Poll和Modbus Slave的Display菜单显示了这种情况:
在现有的计算机中,二进制常常以字节数组的形式存在于程序当中。例如在C#里面,就用byte[],标准C里面没有byte类型,但可以通过typedef把byte定义为unsigned char的别名,效果是一样的。JS设计之初似乎就没想过要处理二进制,对于字节的概念可以说是非常非常的模糊。如果要表达字节数组,那么似乎只能用一个普通数组来表示。
通常也被成为“网际套接字地址结构”,以sockaddr_in命名,定义在<netinet/in.h>头文件中。
科学巨匠尚且如此,何况芸芸众生呢。我们不可能每个软件都从头开始搞起。大部分时候,我们都是利用已有的软件,不管是应用软件,还是操作系统。所以,对于MIPS架构来说,完全可以把在其它架构上运行的软件拿来为其所用。
文件的发送和接收基本上就是读取和写入数据的过程。在Go中,我们可以使用io包中的io.Reader和io.Writer接口来读取和写入数据。
列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。
正数的原、反、补码都相同 对于整形来说:数据存放内存中其实存放的是补码。 为什么呢 ? 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
Linux网络编程套接字 零、前言 一、网络基础知识 1、源IP地址和目的IP地址 2、源MAC地址和目的MAC地址 3、认识端口号 4、PORT VS PID 5、TCP和UDP协议 6、网络字节序 二、socket编程接口 1、sockaddr结构 2、socket 常见API 零、前言 本章就Linux网络编程进行概念及接口学习,下一篇则是简单的进行上手网络套接字编程 一、网络基础知识 1、源IP地址和目的IP地址 在数据传输时各网络协议栈会对数据进行报头封装,而在IP数据包头部中, 有两个IP
每个协议族都定义了自己的套接口地址结构,名字均以sockaddr_开头,对应协议族的标志结束。大部分套接口函数需要指向套接口地址结构的指针作为参数。
譬如某PLC 以ABCD 方式存储一个数值1,另外一个PLC以CDAB方式将存储的BUFFER读出来,那读出来的值就变成了65536。
前文已经提及,编号字符集CCS(简称字符集)与字符编码方式CEF(简称编码方式)这两个概念,在早期并没有必要严格区分。
我们知道,一个变量的创建是要在内存中开辟空间的,而且所开辟空间的大小是根据不同的类型决定的,那么,数据在所开辟内存中到底是如何存储的呢?接下来我们探讨这个问题。
我们经常用ping命令,但是可能不知道ping命令的底层协议是ICMP,那到底什么是ICMP
Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。
每台主机都有自己的IP地址,所以当数据从一台主机传输到另一台主机就需要IP地址。报头中就会包含源IP和目的IP
ArrayBuffer对象、TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011 年 2 月发布),ES6 将它们纳入了 ECMAScript 规格,并且增加了新的方法。它们都是以数组的语法处理二进制数据,所以统称为二进制数组。 这个接口的原始设计目的,与 WebGL 项目有关。所谓 WebGL,就是指浏览器与显卡之间的通信接口,为了满足 JavaScript 与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式。文本格式传递一个 32 位整数,两端的 JavaScript 脚本与显卡都要进行格式转化,将非常耗时。这时要是存在一种机制,可以像 C 语言那样,直接操作字节,将 4 个字节的 32 位整数,以二进制形式原封不动地送入显卡,脚本的性能就会大幅提升。
本篇博文是《从0到1学习 Netty》中入门系列的第六篇博文,主要内容是介绍 Netty 中 ByteBuf 的基本使用,包含其组成、创建、写入和读取,通过源码分析和应用案例进行详细讲解,往期系列文章请访问博主的 Netty 专栏,博文中的所有代码全部收集在博主的 GitHub 仓库中;
因为在计算机系统中,数值统一用补码来表示和存储。原因在于,用补码来存储,可以将符号位和数值统一处理,同时加法减法也可以统一处理(CPU只有加法器),补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
对于整形来说,数据存放在内存中其实存放的是补码。原因在于,使用补码,可以将符号位和数值域同一处理。
1).IPv4套接字地址结构 IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在
使用ArrayBuffer对象保存二进制数据,使用TypedArray和DataView 视图来读写数据。
以及他们所占存储空间的大小。 类型的意义: 1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。 2. 如何看待内存空间的视角。
创建网络套接字,用于网络通信使用,类似于文件操作的open函数。该函数在服务器和客户端都会用到。
http://blog.csdn.net/jk110333/article/details/44137423
领取专属 10元无门槛券
手把手带您无忧上云