c语言代码

#include <stdio.h>

struct test{
int a;
unsigned char b;
int c;
};
int main(){
FILE *fp;
fp = fopen("t.log", "w+");
struct test t={1234, 'a', 4321};
struct test t1; fwrite(&t, sizeof(struct test), 1, fp);
rewind(fp);
fread(&t1, sizeof(struct test), 1, fp);
printf("%d\n%c\n%d\n", t1.a, t1.b, t1.c); fclose(fp);
return 0;
}

   C的struct 编译器在编译的时候会内存对齐,看到的是12字节,而不是9字节

ls -l //可以看到大小12
-rwxrwxrwx 1 root    root         12  4月 12 00:07 t.log od t.log //以八进制查看文件
0000000 002322 000000 000141 000000 010341 000000
0000014

  php读取

<?php
$fd=fopen("t.log","r");
//知道C的struct 编译器在编译的时候会内存对齐,直接读取12B的大小
$bin = fread($fd, 12);
$pack = unpack("Ia/Cb/Ic",$bin);
var_dump($pack);
fclose($fd);

  结果

php t.php
array(3) {
["a"]=>
int(1234)
["b"]=>
int(97)
["c"]=>
int(-520093696)
}
c 的结果-52009369显示不对

  经过一顿调试发现,还是没有完全理解 内存对齐

按照内存对齐规则  unsigned char b;会有4个字节的空间,第一个存储数据,其余三个空闲

  struct test{
int a; [1-4]
unsigned char b; [5-8]//这里是4个而非一个,空闲三个
     int c;[9-12]
};
<?php
//注意这里改成C4
$pack = unpack("Ia/C4b/Ic",$bin); php t.php 

array(6) {
  ["a"]=> int(1234)
  ["b1"]=> int(97)
  ["b2"]=> int(0)
  ["b3"]=> int(0)
  ["b4"]=> int(0)
  ["c"]=> int(4321)
}

多出来b2,b3,b4

  

//这里采用字符串,而非字符
$pack = unpack("Ia/a4b/Ic",$bin); php t.php
array(3) {
["a"]=> int(1234)
["b"]=> string(1) "a"
["c"]=>int(4321)
} 结果正常了

  

利用php unpack读取c struct的二进制数据,struct内存对齐引起的一些问题的更多相关文章

  1. SQLite数据库如何存储和读取二进制数据

    SQLite数据库如何存储和读取二进制数据 1. 存储二进制数据 SQLite提供的绑定二进制参数接口函数为: int sqlite3_bind_blob(sqlite3_stmt*, int, co ...

  2. 前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输

    HTML5中的Blob对象只是二进制数据的容器,本身并不能操作二进制,故本篇将对其操作对象FileReader进行介绍. FileReader FileReader主要用于将文件内容读入内存,通过一系 ...

  3. HTML5新特性之文件和二进制数据的操作

    历史上,JavaScript无法处理二进制数据.如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处 ...

  4. python numpy实现多次循环读取文件 等间隔过滤数据

    numpy的np.fromfile会出现如下的问题,只能一次性读取文件的内容,不能追加读取,连续两次的np.fromfile读到的东西一样 如果数据文件太大(几个G或以上)不能一次性全读进去,需要追加 ...

  5. erlang二进制数据垃圾回收机制

    erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两 ...

  6. Python使用struct处理二进制(pack和unpack用法)

    转载自:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 这篇文章写的很好,所以无耻的转了.. 有的时候需要用python处理二进 ...

  7. Pytho, struct处理二进制(pack和unpack)

    [转]Python使用struct处理二进制(pack和unpack用法) Leave a reply 转载自:http://www.cnblogs.com/gala/archive/2011/09/ ...

  8. 使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...

  9. Python使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...

随机推荐

  1. android 在EditText中显示表情图片

    public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { su ...

  2. HDU_2041——走楼梯,递推

    Problem Description 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?   Input 输入数据首先包含一个整数N,表示测试实例的个数,然 ...

  3. SQL-Employees Earning More Than Their Managers

    思路: 今天复习数据库突然想起来leetcode上数据库的题目,就找来做了 (1)给表取别名 格式见code,这在自身连接的时候是很有必要的 (2)自身连接 from语句后面相当于接了“一张表”,如果 ...

  4. 形形色色的软件生命周期模型(4)——MSF、实用型

    摘要: 读大学时,我们曾经学习过不少软件生命周期模型,当时还不是很懂软件开发,你可能会觉得这些东西很新奇.在实际工作中,你会发现这些模型其实很难应用,与此同时你会接触到RUP.MSF等权威软件公司的生 ...

  5. Button 对象

    <html> <form> <input type="button" value="提交" accesskey="b&q ...

  6. js日期和毫秒相互转换

    var date = new Date(); var n = date.valueOf() var date2 = new Date(n); console.info(date.valueOf()); ...

  7. 设置UIScrollView只可以水平或者竖直滚动

    UIScrollView里边包含多个UIWebView: 可以通过设置contentSize的值,设置其width为UIScrollerView可视区域的宽度:即UIScrollView的width, ...

  8. [原创作品] 对获取多层json值的封装

    今天篇头不废话了,交流加群:164858883 在我们接收后端返回的json数据的时候,在数据缺失的时候,如果直接接收会导致致命错误的发生.可能有些同学会说通常都会有,不用判断直接获取也行.之前我也是 ...

  9. [OGRE]看备注学编程(02):打地鼠01-布置场地九只地鼠

    项目下载地址:http://download.csdn.net/detail/wxg694175346/6340347 头文件ShrewMouseApplication.h: #ifndef __Sh ...

  10. 《Linux Device Drivers》第十二章 PCI司机——note

    一个简短的引论 它给这一章总线架构的高级概述 集中访问讨论Peripheral Component Interconnect(PCI,外围组件互连)外设内核函数 PCI公交车是最好的支持的内核总线 本 ...