字节序

memcpy与大小端

試著忘記壹切 提交于 2019-11-29 02:41:58
搬运自我的CSDN: https://blog.csdn.net/u013213111/article/details/100149145 参考: 大端 小端 与memcpy 网络字节序和大小端字节序 来看这样一段代码: 本意是想把uint8_t a[2]中的内容合成一个uint16_t b #include <stdlib.h> #include <stdio.h> #include <stdint.h> int main() { uint8_t a[2] = { 0x11, 0x22 }; uint16_t b; memcpy(&b, a, sizeof(b)); printf("a[0]:%x,a[1]:%x\n", a[0], a[1]); printf("b:%x\n", b); return 0; } 在intel的电脑上跑出来的结果如何呢: a[0]:11,a[1]:22 b:2211 也就是说,假如a[1]中存储的是高位byte,a[0]中存储的是低位byte,那么最终合成的uint16_t是正确的;而假如a[0]中存储的是高位byte,a[1]中存储的是低位byte,那么结果就是错误的了。 然而并不是所有的计算机系统都如此,而是要看系统是大端存储模式还是小端存储模式。 小端存储模式(小端字节序),指的是数据的高字节位置保存在内存的高地址处

JavaScript之ArrayBuffer

你。 提交于 2019-11-29 00:50:08
在写作这篇博客的时候,参照了下面三篇博客: https://www.cnblogs.com/jixiaohua/p/10714662.html (写的很详细,参照比较多) https://www.cnblogs.com/copperhaze/p/6149041.html https://zh.javascript.info/arraybuffer-binary-arrays 文章中有一些内容是直接从上面博客复制过来的,并不是想要抄袭,只是觉得写博客可以增加理解度,别切可以避免遗忘。在此感谢上面三位博主的文章。 DataView部分完全复制上面第一个链接的博客。 ArrauBuffer对象、TypedArray视图和DataView视图是JavaScript中**专门操作二进制数据的接口**。他们都是以数组的方式操作二进制数组,所以被称为二进制数组。最初为了满足JavaScript与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式的背景下诞生的。 一.ArrayBuffer相关介绍 ArrayBuffer指的是一段连续的内存区域。 let buffer = new ArrayBuffer(40); // 在内存中开辟40个字节长度的内存区域 alert(buffer.byteLength); // 40 1

【网络编程】TCP网络编程

折月煮酒 提交于 2019-11-28 11:07:53
TCP网络程序设计 一、模型函数化 图片:TCP编程模型 1.1 创建套接字Socket #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); 1.2 绑定地址 Bind 图片 地址类型Struct #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); //通用地址类型 struct sockaddr { sa_family_t sa_family;//协议族类型 char sa_data[14];//地址 } // IPV4 地址类型 struct sockaddr_in { short int sin_family; unsigned short int sin_port;//Port struct in_addr sin_addr; //IP地址 4 bytes int (整数型IP地址) unsigned char sin_zero[8];//填充??? } struct in_addr { unsigned long s_addr; } 1.3 地址转换(网络字节序——整数型)

Linux之SOCKET编程

这一生的挚爱 提交于 2019-11-28 06:32:38
SOCKET编程 一、预备知识 1. 网络编程基础 为了简化开发通信程序的工作,由Berkely学校开发了一套网络通信程序的API函数 标准socket标准被扩展成window socket和unix socket linux中的网络编程通过socket接口实现 。Socket既是一种特殊的IO,它也是一种文件描述符。 一个完整的Socket 都有一个相关描述{ 协议,本地地址,本地端口,远程地址,远程端口 };每一个Socket 有一个本地的唯一Socket 号,由操作系统分配。 2. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢? 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存 ,因此,网络数据流的地址应这样规定: 先发出的数据是低地址,后发出的数据是高地址 。 TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。 计算机有大端小端字节序之分 例如UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地址1是0xe8,也就是先发0x03,再发0xe8

通信网络实验-socket编程

99封情书 提交于 2019-11-28 06:23:28
Socket编程学习 一、Socket简介 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个外观模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 二、Socket使用方法 使用Socket时,要分别在服务器端和客户端进行设置。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。整个过程可以用一张图概括如下: 三、Socket的基本函数 1.socket() int socket(int domain, int type, int protocol); socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它

详解大端模式和小端模式

假装没事ソ 提交于 2019-11-28 05:53:50
详解大端模式和小端模式 一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。 二、什么是大端和小端 Big-Endian和Little-Endian的定义如下: 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 举一个例子,比如数字0x12 34 56 78在内存中的表示形式为: 1)大端模式:

去除 \\ufeff

寵の児 提交于 2019-11-28 02:44:18
语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现 \ufeff, 打印代码如下 f = open('new2.txt', encoding='UTF-8') # 打开文件,以 UTF-8 编码 l = [] for line in f: l.append(line.strip()) print(l) 打印结果为: 只需改一下编码就行,把 UTF-8 编码 改成 UTF-8-sig f = open('new2.txt', encoding='UTF-8-sig') l = [] for line in f: l.append(line.strip()) print(l) 打印结果为: utf-8与utf-8-sig两种编码格式的区别: As UTF-8 is an 8-bit encoding no BOM is required and anyU+FEFF character in the decoded Unicode string (even if it’s the firstcharacter) is treated as a ZERO WIDTH NO-BREAK SPACE. UTF-8以字节为编码单元

java 字符串的编码与C#的区别

浪尽此生 提交于 2019-11-27 12:37:27
1, 字符串 转换为字节数组 时的区别。 JAVA: 当我们使用方法 getBytes() 转换为byte数组时 如: 使用UTF-8 时: String str="我是中国人"; byte[] result=str.getBytes("utf-8"); 输出结果为:[-26, -120, -111, -26, -104, -81, -28, -72, -83, -27, -101, -67, -28, -70, -70] C# : 使用System.Text.Encoding.UTF8.GetBytes(str); 输出结果为:[230, 136, 145, 230, 152, 175, 228, 184, 173, 229, 155, 189, 228, 186, 186] 使用GB2312时 : java输出: [-50, -46, -54, -57, -42, -48, -71, -6, -56, -53] C#输出: [206, 210, 202, 199, 214, 208, 185, 250, 200, 203] 我们发现 java 中输出的是都是 C#输出-256 的值 如上两中第一个 : 206-256=-50 , 偶较愚钝不知为什么会这样,如果有哪位N人经过看到了,还望指点,指点。 2, 上面的虽然byte数组内的值不一样,但最各自转换成 Base64

刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元

情到浓时终转凉″ 提交于 2019-11-27 02:36:14
Unicode字符集的编码方式以及码点、码元 一、字符编码方式CEF 的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节。 比如,汉字“严”的Unicode码(Unicode码点值、Unicode编号)是十六进制数4E25,转换成二进制数有15位(100 1110 0010 0101),对“严”这个字符的编号进行编码的话,至少需要2个字节。表示其他更大编号的字符,可能需要3个字节或者4个字节,甚至更多。 2. 这带来两个问题: 一是,如何才能区别Unicode字符和ASCII字符的编码?计算机怎么知道三个字节表示的是一个字符,而不是分别表示三个字符呢? 二是,我们知道,英文字母只用一个字节来编码就够了,而如果Unicode统一硬性规定,每个字符都用两个、三个或四个字节来编码,那么每个英文字母编码的前面都必然有一个、两个到三个字节全是0,这对于存储和传输来说是极大的浪费。 这就涉及到了字符编码方式CEF的选择问题。Unicode字符的编码方式一般有三种:UFF-8、UTF-16、UTF-32。在具体介绍这些编码方式之前,需要再次深入了解两个概念—— 码点 (Code Point) 与码元(Code Unit)。 二、码点 1.

Windows中进程的内存结构

落爺英雄遲暮 提交于 2019-11-26 17:39:09
基础知识: 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Register)。每种变量都有不同的分配方式。先来看下面这段代码: #include <stdio.h> int g1=0, g2=0, g3=0; int main() { static int s1=0, s2=0, s3=0; int v1=0, v2=0, v3=0; //打印出各个变量的内存地址