memcpy与大小端

搬运自我的CSDNhttps://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,那么结果就是错误的了。
然而并不是所有的计算机系统都如此,而是要看系统是大端存储模式还是小端存储模式。
小端存储模式(小端字节序),指的是数据的高字节位置保存在内存的高地址处,数据的低字节保存在内存的低地址处,例如intel x86采用的就是小端存储模式。
相反地,大端存储模式(大端字节序),指定就是把数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中。

当计算机之间通过网络传输数据时,就特别需要注意大小端的问题。首先,不同的计算机系统可能并不都采用大端模式或者都采用小端模式,在混用存储模式的情况下,就有可能导致数据读取的错误;其次,由于网络字节序被规定为大端字节序,而如果计算机采用的是小端字节序,那么就需要进行一次转换了。

原文地址:https://www.cnblogs.com/lyrich/p/11441099.html

时间: 2024-10-04 10:10:52

memcpy与大小端的相关文章

关于字符集,编码格式,大小端的简单总结

只要你和计算机打交道,这些问题可以说是天天会遇到,但是很多人是似懂非懂, 能真正完全理解的人却不多, 下面是个人的一些理解,有错欢迎指正. 最早的计算机只支持ASCII码, 具体来说就是用1个字节(最高位为0, 没有用)表示0到127,总共128个字符, 这样就可以完全满足英语应用的要求了. 后来扩展到欧洲语系,理论上一个字节可以表示256个字符, 欧洲人就把剩余的128个字符(最高位为1)按照自己语言(法语,德语...)的要求扩充应用了起来, 好像也能满足需要. 然后又到了亚洲国家,比如中国,

C 学习之大小端

题外话:如有误,请留言通知我. 大小端,是数值在内存中的排列方式:数值的高低位与内存地址的大小 的关系. 大/小端,英文Big/Little Endian. 注意:endian,就是字节序.字节存储顺序的意思,也有尾数的意思.这里取尾数的含义刚刚好,原因如下. 先说一个前提:内存地址的前xx位通常是系统保留区,用于运行内核程序.所以用户程序就从另一端开始占用 --- 这就是为什么用户程序是从高位地址开始往低位地址伸展.(另一种可能本文不考虑) 在上面的前提下,我们已知int类型的长度是4 byt

C语言之大小端问题

1:大小端名字的由来及发展 (1)在乔纳森·斯威夫特的著名讽刺小说<格列夫游记>中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破.斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧. (2)后来计算机通信发展起来后,遇到一个问题就是:在串口等串行通信中,一次只能发送1个字节.这时候我要发送一个int类型的数就遇到一个问题.int类型有4个字节,我是按照:byte0 byte1 by

C# Socket流数据大小端读写封装

网络数据是大端模式,而c#中的数据小端结构,那么在读写网络数据的时候需要进行转换.c#类库IPAddress已经封装了大小端的转换. 封装代码如下: [csharp] view plain copy using System.IO; using System.Net; using System; namespace Framework { public class NetStream { private MemoryStream stream; private BinaryReader read

内存对齐和大小端

一.内存对齐的原因 根本原因:cpu是根据内存访问粒度(memory access granularity,下文简写成MAG)来读取内存,MAG就是cpu一次内存访问操作的数据量,具体数值依赖于特定的平台,一般是2byte.4byte.8byte. 内存对齐:更够减少内存读取次数(相对于内存不对齐),为了访问未对齐的内存,处理器需要作两次内存访问:而对齐的内存访问仅需要一次访问. 二.内存对齐的步骤 每个平台上的编译器都有自己的默认“对齐系数”.同时,我们也可以通过预编译命令#pragma pa

CPU的大小端及如果判断

不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的. 存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大端模式(Big Endian)和小端模式(Little Endian). 大端存储模式是指字或半字的最高字节(Most Significant Bit,MSB)存放在内存的最低位字节地址上,而字数据的低字节则存放在高地址中.打个比方,有一个字为0×12345678,这个字由4个字节组成, 从高位到低

union关键字及大小端模式

1. union 关键字 union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在 union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址.例子如下: union StateMachine { char character; int number; char *str; double exp; }; 一个 union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是 double 型

[Linux] Big-endian and Little-endian (大小端模式)

大小端模式 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致.

java的大小端和转换

一直以为大小端针对的bit的顺序,今天才知道:大小端的分度值是 byte,即每一个byte都是按照正常顺序,但是byte组装成一个int 或者是 long等时每个byte的摆放位置不同. 测试代码: public class BufferTest { @Test public static void main(String[] args) { ByteBuffer buffer= ByteBuffer.allocate(4); buffer.order(ByteOrder.BIG_ENDIAN)