Python如何将C结构体数据保存为二进制文件
前言
如题所述,本文将介绍Python和C之间的数据交互问题。我们的目标是,在Python中将结构性数据保存为二进制文件,然后在C中将二进制文件数据加载到结构体,直接就可以使用,不需要再进行其他的数据转换。在Python中将结构性数据保存为二进制文件
作为测试,这里我们使用的结构性数据,其数据结构如下:typedefstruct{inta;floatb;intarray〔10〕;array〔10〕;intmatrix〔3〕〔3〕;matrix〔3〕〔3〕;floattensor〔2〕〔3〕〔4〕;tensor〔2〕〔3〕〔4〕;}MyStruct;
通过下面的代码,即可将上述结构性数据保存为二进制文件data。bin:importstructimportnumpyasnp定义多个嵌套的Struct实例structintfloatstruct。Struct(if)structarraystruct。Struct(10i)structmatrixstruct。Struct(9i)structtensorstruct。Struct(24f)inta123floatb3。14intarray〔1,2,3,4,5,6,7,8,9,10〕intmatrix〔〔1,2,3〕,〔4,5,6〕,〔7,8,9〕〕floattensor〔〔〔1。1,1。2,1。3,1。4〕,〔2。1,2。2,2。3,2。4〕,〔3。1,3。2,3。3,3。4〕〕,〔〔4。1,4。2,4。3,4。4〕,〔5。1,5。2,5。3,5。4〕,〔6。1,6。2,6。3,6。4〕〕〕由列表转为数组格式,方便后面进行一维展开intarraynp。array(intarray)intmatrixnp。array(intmatrix)floattensornp。array(floattensor)将结构体实例中的各字段打包为字节串多维数组需要先进行一维展开,然后才能进行打包packedabstructintfloat。pack(inta,floatb)packedarraystructarray。pack(intarray)packedmatrixstructmatrix。pack(intmatrix。flatten())packedtensorstructtensor。pack(floattensor。flatten())将各字段的字节串连接为最终的字节串packeddatapackedabpackedarraypackedmatrixpackedtensor将字节串写入二进制文件withopen(data。bin,wb)asf:f。write(packeddata)print(〔Info〕Finished)
运行结果如下图所示:
在Python中将二进制文件解析出来,验证数据是否正确
上面我们将结构性数据保存为了二进制文件,那么在python中我们如何将二进制文件解析成结构性数据呢?至少我们得验证一下保存的文件是否正确。
完整的代码如下:importstructimportnumpyasnp定义多个嵌套的Struct实例structintfloatstruct。Struct(if)structarraystruct。Struct(10i)structmatrixstruct。Struct(9i)structtensorstruct。Struct(24f)从二进制文件中读取数据withopen(data。bin,rb)asf:packeddataf。read()解包数据为元组dataabstructintfloat。unpack(packeddata〔:8〕)dataarraystructarray。unpack(packeddata〔8:48〕)datamatrixstructmatrix。unpack(packeddata〔48:84〕)datatensorstructtensor。unpack(packeddata〔84:180〕)将解包后的数据转换为结构体实例先转成array格式,方便后面的reshape操作inta,floatbdataabintarraynp。array(dataarray)intmatrixnp。array(datamatrix)floattensornp。array(datatensor)intmatrixintmatrix。reshape(3,3)floattensorfloattensor。reshape(2,3,4)print()print(finta{inta})print(floatb{:。4f}。format(floatb))print()print(intarray{}。format(intarray))print()print(intmatrix{}。format(intmatrix))print()print(floattensor{}。format(floattensor。round(4)))print()print(〔Info〕Finished)
程序运行结果如下图所示(可以看到,数据与我们保存进去的是一致的):
在C中读取二进制文件,直接加载到结构体
在前言中我们提到,我们的目的就是在C中直接将Python保存的二进制数据加载到结构体进行使用,不需要再做额外的数据转换。那么,该如何做呢?请看下面的完整代码:includefstreamincludeiostreamusingnamespacestd;typedefstruct{inta;floatb;intarray〔10〕;array〔10〕;intmatrix〔3〕〔3〕;matrix〔3〕〔3〕;floattensor〔2〕〔3〕〔4〕;tensor〔2〕〔3〕〔4〕;}MyStruct;intmain(){std::stringfilepathdata。bin;打开要读取的二进制文件std::ifstreaminputfile(filepath,std::ios::binary);检查文件是否成功打开if(!inputfile。isopen()){文件打开失败std::coutopenfilepathfailed!std::endl;return1;}获取文件大小inputfile。seekg(0,std::ios::end);std::streamposfilesizeinputfile。tellg();inputfile。seekg(0,std::ios::beg);std::coutfilesizefilesizestd::endl;读取文件到缓冲区charbuffernewchar〔filesize〕;inputfile。read(buffer,filesize);关闭文件inputfile。close();将缓冲区中的数据转换为结构体MyStructmystructreinterpretcastMyStruct(buffer);输出结构体的数据std::coutstd::endl;std::coutamystructastd::endl;std::coutbmystructbstd::endl;std::coutstd::endl;std::coutarray〔;intarraylensizeof(mystructarray)sizeof(mystructarray〔0〕);for(inti0;iarraylen;i){std::coutmystructarray〔i〕,;}std::cout〕std::endl;std::coutstd::endl;std::coutmatrix〔std::endl;for(inti0;i3;i){std::cout〔;for(intj0;j3;j){std::coutmystructmatrix〔i〕〔j〕,;}std::cout〕,std::endl;}std::cout〕std::endl;std::coutstd::endl;std::couttensor〔std::endl;for(inti0;i2;i){std::cout〔;for(intj0;j3;j){std::cout〔;for(intk0;k4;k){std::coutmystructtensor〔i〕〔j〕〔k〕,;}std::cout〕,std::endl;}std::cout〕,std::endl;}std::cout〕std::endl;std::coutstd::endl;delete〔〕buffer;return0;}
程序运行效果,如下图所示:
可以看到,我们在C中读取二进制数据后,直接加载到结构体中,最终显示出来的正是我们预期的数据。
至此,关于在Python中如何将C结构体数据保存为二进制文件的介绍就结束了,希望对大家能有所帮助。如果觉得不错的话,可以帮忙点个赞哦。
车轮滚滚尘土飞扬!普宁南溪上演速度与激情视频加载中(2023年普宁狼队第十二届年会越野挑战赛,时长共3分24秒)2023年普宁狼队第十二届年会越野挑战赛1月6日至7日,在揭阳普宁市南溪体育公园,一场热血澎湃的越野盛事正式
时报观察丨跳出猪价波动周期率点蓝字关注,不迷路国家发改委近日发布预警,猪粮比价已进入过度下跌三级预警区间。而3个多月前,36个大中城市精瘦肉零售价格周均价变动幅度还处于过度上涨二级预警区间。猪价从过度上涨到过
搜狐张朝阳携新书做客东方甄选教育应让人保持兴趣日前,搜狐公司董事局主席兼CEO张朝阳携首部著作张朝阳的物理课做客东方甄选,与主播董宇辉明明畅谈新书创作经历开授物理课初衷,同网友分享了费曼学习法如何对抗焦虑等涉及教育心理价值观的
北约与欧盟签署合作宣言应对共同威胁来源新华网北约和欧盟10日签署合作联合宣言,旨在加强欧洲集体防御,应对共同的安全威胁。当天上午,北约秘书长斯托尔滕贝格欧洲理事会主席米歇尔和欧盟委员会主席冯德莱恩在北约总部共同出席
法媒空客2022年订单与交付数量超过波音据法新社巴黎1月10日报道,面对波音,空客正巩固其民用航空领域世界第一的地位比起处于康复期但遭遇供应商难以跟上其增长速度问题的美国竞争对手波音,欧洲飞机制造商空客在2022年交付了
关于感情从前的打扰,扰到极点之后便不会了,不再打扰了,风,没吹过,雨,没来过,我,没爱过。所以喜欢一个人这件事,终究就是一个漫长的笑话什么东西都是攒出来的,好感是,失望也是。付出给一个人真
男人现在生活中的10条定律头条创作挑战赛1随着自身素质越来越高,身边的朋友会越来越少。2能够拥有的钱越多,反而负担会感觉越重。3爱的越深,激情过后感觉越是累。4当你饭量越来越少时,健康反而变得健康了。5越是
一个女人动了情,往往是控制不住自己的,很真实文充满元气的芳胖胖编辑充满元气的芳胖胖在男女相处中,情感是最难说清楚的事情。很多人,就连自己是否喜欢对方都不敢确定,更何况是对方是否喜欢自己呢?多数情况下,往往是彼此都不确定,都不
新的一年,请以这三种心态来爱自己!白驹过隙,似水流年。无论曾经有多少美好,多少遗憾,都成为了过去。无论未来多么遥远,多么艰辛,都需要我们勇敢面对。凡为过往,皆为序章。新的一年,一切都是新的开始。新的一年,愿你活出自
越南最脏温泉,允许男女混浴,生意好到经常爆满越南推出了史上最脏的温泉浴,当地允许男女一起混浴,现在很多游客会来这里玩耍,都会体验一下当地这种特色的项目!(此处已添加小程序,请到今日头条客户端查看)而最脏的温泉,就是当地有名的
冬季女人阳虚怕冷,手脚冰凉,7个症状表现很明显,记得调理寒邪入体,后患无穷。阳虚之人要谨防寒邪。黄帝内经中提到过冬伤于寒,春必病温。如果冬季不注意保暖,被寒气损伤,那么病邪潜伏在体内,等来年春天,天气转暖。则容易被各种引起发烧的传染病所