python struct.pack() 二进制文件,文件中打包二进制数据的存储与解析

  学习Python的过程中,遇到一个问题,在《Python学习手册》(也就是《learning python》)中,元组、文件及其他章节里,关于处理二进制文件里,有这么一段代码的处理:

  >>>F=open(‘data.bin‘,‘wb‘)

  >>>import struct

  >>>data=struct.pack(‘i4sh‘,7,‘spam‘,8)

  >>>data

  b‘\x00\x00\x00\x07spam\x00\x08‘

  >>>F.write(data)\

  >>>F.close()

  实际上,无论是在python 2.x 或 3.x中,执行第三步data=struct,pack(...)时,输出会报错,报错:

Traceback (most recent call last):

  File "<pyshell#3>", line 1, in <module>

  data=struct.pack(‘>i4sh‘,7,‘spam‘,8)
  struct.error: argument for ‘s‘ must be a bytes object

  查看帮助文档,可以看到介绍:

ructstruct.pack(fmt, v1, v2, ...)

  Return a bytes object containing the values v1, v2, ? packed according to the format string fmt. The arguments must match the values required by the format exactly.

  格式化字符串的值再Python中的类型是bytes类型,所以我们需要做处理。→在bytes类型前面加上一个b可以解决这个问题。

  >>>data=struct,pack(‘>i4sh‘,7,b‘spam‘,8)

b‘\x00\x00\x00\x07spam\x00\x08‘

  到此问题解决!

  struct.pack(fmt,v1,v2..),fmt是一种Linux命令,功能是编排文本文件。具体操作,此处不做过多记录。

  #  按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)

  顺便再做下‘>i4sh’的介绍,它在C数据结构和Python中的数据结构:

  i-->int-->integer--->7

  4s-->char-->string--->‘spam‘

  h-->unsigned short-->integer-->8

  

  

时间: 2024-10-14 21:10:56

python struct.pack() 二进制文件,文件中打包二进制数据的存储与解析的相关文章

python struct.pack方法报错argument for &#39;s&#39; must be a bytes object 解决

参考 https://blog.csdn.net/weixin_38383877/article/details/81100192 在python3下使用struct模块代码 fileHead = struct.pack('128sl', os.path.basename(filePath),os.stat(filePath).st_size); 抛出异常: argument for 's' must be a bytes object必须要是字节类型. 解决办法: 把字符串的地方转为字节类型,

从视频文件中读入数据--&gt;将数据转换为灰度图--&gt;对图像做candy边缘检测

//从视频文件中读入数据-->将数据转换为灰度图-->对图像做candy边缘检测 //作者:sandy //时间:2015-10-10 #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]){ //预备工作 CvCapture* capture=cvCreateFileCapture("E:\\Videos\\xx.avi");//让capture变量指向视频文件 i

SQLServer 从xml 文件中提取节点数据到数据库中

原文出处:http://blog.csdn.net/kk185800961/article/details/12350715  转载请注明出处 XML实例文件: <?xml version="1.0" encoding="utf-8"?> <!-- edited with XMLSpy v2010 (http://www.altova.com) by fengshuai (founder) --> <Root> <Frame

除去文件中的重复数据

1.先对文件内容排序:cat 1.txt |sort > 2.txt 保存到2.txt中 2.使用vim打开2.txt 执行替换命令: 替换空格:%s/ //g 替换tab:%s/^I//g   (注意:^I 是直接按键盘是的tab键) 替换$:  %s/^M//g (注意:^M 是按ctrl+v 再按Enter键) 3.cat 2.txt | uniq > 3.txt 本文为Eliot原创,转载请注明出处:http://blog.csdn.net/xyw_blog/article/detai

七. 从文件中加载数据

从文件中加载数据有两种方法,一种是利用内置的csv模块,一种是利用第三方模块numpy import matplotlib.pyplot as plt import csv import numpy as np # csv 方法 x = [] y = [] with open('example.txt','r') as csvfile: plots = csv.reader(csvfile, delimiter=',') for row in plots: x.append(int(row[0]

python struct.pack中的对齐字节问题

最近测试涉及到了序列字节化相关问题,碰到一个头疼的问题 buff = struct.pack("3s","B00")    print repr(buff) 输出:'B00' buff = struct.pack('i',10172) print repr(buff) 输出:"\xbc'\x00\x00" buff = struct.pack("3si","B00",10172)print repr(buf

python从Microsoft Excel文件中导入数据

excel中后缀为csv和xls,二者区别如下:1.xls 文件就是Microsoft excel电子表格的文件格式.2.csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中. 此文件,一行即为数据表的一行.生成数据表字段用半角逗号隔开.csv是文本文件,用记事本就能打开,XLS是二进制的文件只有用EXCEL才能打csv文件是以逗号为分隔符号,将各字段列分离出的一种ASCII文件.csv(*.csv) 文件格式只能保存活动工作表中的单元格所显示的文本和数值.工作表中所有的数

Python: 程序print到文件中

Python 3.x 将输出内容写入到一个文件,需要两个命令.open指明Python用什么文件名,w 意味着我们要写入该文件, encoding=”utf-8″指明Python如何把中文写入该文件.包含 file = f 的print (打印)语句,来输入数据到文件中. f = open("output.csv","w",encoding="utf-8") print('some text' , file=f) f.close() 注意: py

python解析pcap文件中的http数据包

使用scapy.scapy_http就可以方便的对pcap包中的http数据包进行解析 scapy_http可以在https://github.com/invernizzi/scapy-http下载,该地址下也给出了简单的示例程序,按照此示例程序我修改了一个输出pcap包中http包的源目的地址.payload的小程序,如下所示: 其中,p为数据包,scapy_http将其分为: Ethernet->TCP->RAW三个层次, 使用p.show()函数可以打印出如下结果: ###[ Ether