字节字符和整数转换-大小端转换-结构体内存(文件)对齐规则之总结

1.char*,unsigned char*字节,char,unsigned char字符和整型的转换的理解
char*,unsigned char*记录的就是二进制转换到的十六进制的字节码(整数补码(正整数还是原码负整数补码),浮点数IEEE74原码,字符编码原码),
存放顺序是先入先存放的,超过一个字节就会区分大小端存放。char*,unsigned char*指针转换到char,unsigned char会转换到字符类型。
但是char,unsigned char整数运算还是十六进制的字节码(包括位运算之类),所以可以提供十六进制整数序列,用整数指针访问序列每个元素(对于十六进制的字节码直接进行CRC计算。
如果希望char,unsigned char整数运算,能得到从整数来的值那么需要截取一个字节来处理;或者采用结构体赋予整型值放置在内存或者二进制文件中读取出来,然后一个个char,unsigned char整数运算
处理。

 2.大小端转换,整型浮点或者字符编码超过一个字节的在内存还是文件中都是有大小端转换的,二进制文件就是将内存中的情况完全一致的存储起来。

数值数据存在大小端区别,CC++结构体存储数值数据到二进制文件中,是以小端模式存放的,其实内存中也是小端模式的字节存放的(主流的CPU都这样);而PNG数值类型数据是以大端模式存放的,所以从二进制文件中读取出来的时候需要经过大端到小端的转换,写入到png文件中的时候需要经过小端到大端的转换,而png的一些基于二进制CRC校验都是在大端模式下的缓存块中进行的(压缩不确定是否如此,应该是在小端模式下进行压缩编码的)。

png图片数据是用Big-Endian存储数值数据的需要转换为大端模式。


 3.结构体内存对齐,结构体在内存中本身存在内存对齐,所以写入到二进制文件中也有内存对齐问题, 读取出来时候需要减掉得到真实有用数据。

 结构体内存对齐参数由#pragma pack(8)决定默认是8
 1)第一个是系统找一个以对齐参数N倍数的地址为初地址(首地址偏移为0),后面的地址依次用min(N,本成员)作为实际对齐参数,该参数首个倍数地址(从首地址偏移)作为成员内存地址;
 2) 内存对齐最终大小,是max(n1,n2,n3,...)最大元素的整数倍,不够后面就补0字节。

 特殊:
 1)嵌套结构体是作为一个递归成员,内部成员大小为n自身对齐min(n,N)。但是内部第一个偏移:将内部最大作为n最终取min(n,N)作为对齐参数,首个倍数地址为内存地址。
内部右边界到外部第一个偏移:用的就是外部的成员作为n最终取min(n,N),首个倍数地址作为内存地址。
 2) 数组成员(拆分):包含数组时候,整个数组不是作为一个成员,而是里面的每个元素作为一个结构体成员。
 3) 有位段时的对齐规则(组合):同类型的、相邻的可连续在一个类型的存储空间中存放的位段成员作为一个该类型的成员变量来对待, 不是同类型的、相邻的位段成员,分别当作一个单独得该类型的成员来对待,分配一个完整的类型空间,其长度为该类型的长度,其他成员的分配规则不变,仍然按照前述的对齐规则进行。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值