总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。

python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。

import struct

a=12.34

#将a变为二进制

bytes=struct.pack('i',a)

此时bytes就是一个string字符串,字符串按字节同a的二进制存储内容相同。

再进行反操作

现有二进制数据bytes,(其实就是字符串),将它反过来转换成python的数据类型:

a,=struct.unpack('i',bytes)

注意,unpack返回的是tuple

所以如果只有一个变量的话:

bytes=struct.pack('i',a)

那么,解码的时候需要这样

a,=struct.unpack('i',bytes) 或者 (a,)=struct.unpack('i',bytes)

如果直接用a=struct.unpack('i',bytes),那么 a=(12.34,) ,是一个tuple而不是原来的浮点数了。

如果是由多个数据构成的,可以这样:

a='hello'

b='world!'

c=2

d=45.123

bytes=struct.pack('5s6sif',a,b,c,d)

此时的bytes就是二进制形式的数据了,可以直接写入文件比如 binfile.write(bytes)

然后,当我们需要时可以再读出来,bytes=binfile.read()

再通过struct.unpack()解码成python变量
a,b,c,d=struct.unpack('5s6sif',bytes)

'5s6sif'这个叫做fmt,就是格式化字符串,由数字加字符构成,5s表示占5个字符的字符串,2i,表示2个整数等等,下面是可用的字符及类型,ctype表示可以与python中的类型一一对应。

Format C Type Python 字节数
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or long 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long

最后一个可以用来表示指针类型的,占4个字节

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而还提供了

Character Byte order Size and alignment
@ native native            凑够4个字节
= native standard        按原字节数
< little-endian standard        按原字节数
> big-endian standard       按原字节数
! network (= big-endian) standard       按原字节数

使用方法是放在fmt的第一个位置,就像'@5s6sif'

-----二进制文件处理时会碰到的问题-----

我们使用处理二进制文件时,需要用如下方法

binfile=open(filepath,'rb')    读二进制文件

binfile=open(filepath,'wb')    写二进制文件

那么和binfile=open(filepath,'r')的结果到底有何不同呢?
不同之处有两个地方:

第一,使用'r'的时候如果碰到'0x1A',就会视为文件结束,这就是EOF。使用'rb'则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在'0X1A',就只会读出文件的一部分。使用'rb'的时候会一直读到文件末尾。

第二,对于字符串x='abc\ndef',我们可用len(x)得到它的长度为7,\n我们称之为换行符,实际上是'0X0A'。当我们用'w'即文本方式写的时候,在windows平台上会自动将'0X0A'变成两个字符'0X0D','0X0A',即文件长度实际上变成8.。当用'r'文本方式读取时,又自动的转换成原来的换行符。如果换成'wb'二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。'0X0D'又称回车符。
linux下不会变。因为linux只使用'0X0A'来表示换行。

注意:如果你遇到“struct.error: unpack requires a string argument of length ..”长度错误,通常是由于字节对齐的缘故;

转载于:https://www.cnblogs.com/xiayong123/archive/2012/02/26/3717142.html

python二进制处理详述相关推荐

  1. python 二进制,十进制,十六进制

    十进制:decimal system,每一位最高为9,达不到10 二进制:binary system,每一位最高为1,达不到2 八进制:octonary number system,每一位最高为7,达 ...

  2. python十进制转换其他进制直到输入q结束,python二进制转换,python将十进制转为二进制,题目描述:输入一个整...

    python二进制转换,python将十进制转为二进制,题目描述:输入一个整 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: python没有unsignedin ...

  3. python二进制和图片转换

    python二进制和图片转换 之前做项目,发现很多图片都是存储成二进制的形式,比如存储为.bin .dat等文件,如果你直接用记事本打开文件,会发现里面内容如下: 0005 0000 0000 000 ...

  4. Python——二进制16位加法器(采用手算二进制加法的过程实现)(tkinter实现)【2021-07-08】

    Python--二进制16位加法器(采用手算二进制加法的过程实现)(tkinter实现) 1.add16bit.py 2.结果示例 3.下篇文章预告 [功能模块作者] CSDN用户(TDTX),TDT ...

  5. Python——二进制8位加法器(采用手算二进制加法的过程实现)(tkinter实现)【2021-07-08】

    Python--二进制8位加法器(采用手算二进制加法的过程实现)(tkinter实现) 1.add8bit.py 2.结果示例 [功能模块作者] CSDN用户(TDTX),TDTX主页--负责加法功能 ...

  6. python 二进制流图片解码

    python 二进制流图片解码 背景 背景 为了将 c++ 中的图片数据传输到 python 里,用redis作为中介,先在c++中把类型为 unsigned char * 的二进制图片数据存到 re ...

  7. Python二进制方式切分文件并还原

    Python二进制方式均等切分文件并且合并还原 场景 切分原理图 代码实现 切分方式(图左) 切分方式(图右) 场景 文件传输大小限制时,需要将文件切小,分别发送,合并还原 文件发送限制(比如:破解软 ...

  8. python读取二进制文件_python读取二进制流 Python二进制方式读写文件 - 电脑常识 - 服务器之家...

    python读取二进制流 Python二进制方式读写文件 发布时间:2017-03-18 来源:服务器之家 这两天用Python解析ELF二进制文件,遇到了不少问题,总结整理如下,以便加深对Pytho ...

  9. Python: 二进制字节流数据的读取操作 -- bytes 与 bitstring

    Python: 二进制字节流数据的读取操作 – bytes 与 bitstring 最近项目有个需求,需要对二进制文件读取内容,操作读取到的字节流数据,主要是查找与切片获取内容.这要求有两个标志,一个 ...

  10. Python二进制、八进制、十六进制数字的表示和转换

    除了常用的十进制表示法,Python 也支持二进制.八进制和十六进制表示法.这些只是表示方法不同,但是它们表示的含义是一样的,如二进制中的 11 和十进制数中的 3 是一样的. Python 二进制表 ...

最新文章

  1. 在CentOS 6.9 x86_64上从源码安装xz命令的方法
  2. Blender中的主程序纹理学习课程 Master Procedural Texturing in Blender
  3. gatsby_如何使用Gatsby.js来获取内容
  4. 动手学深度学习笔记一线性回归
  5. epoll监听文件_epoll详解——从功能到内核
  6. 世界首个2nm制程芯片公布!这次IBM跑在了台积电三星英特尔前面
  7. 对于DataSet中的问题真是郁闷啊
  8. Centos7安装tengine-2.3.2版本
  9. Android开发学习笔记(10):NDK安装手顺及应用
  10. ngrx中的memoized函数
  11. PHP第三天!!黑人无表情 面向对象的特点等等!!
  12. 用于实现 Web 服务的 SOA 编程模型,第 10 部分: SOA 用户角色
  13. 生成式模型与判别式模型—大厂笔试汇总
  14. 【POJ 2689】Prime Distance【埃氏筛与线性筛】
  15. 以太坊漫游指南:读懂以太坊发展路线图
  16. RTP音频AAC封包
  17. 新浪微博定位页面代码解析
  18. 从输入URL到网页呈现的过程
  19. 从键盘输入整数n,输出n以内所有质数。
  20. 用计算机在作文格中打单字字,描写一个字的作文

热门文章

  1. 用python打印心形_Python和Js打印心形
  2. c语言单例模式,C语言之单例模式
  3. 翻译:机器学习 数据科学家 top 10 十大算法
  4. 易筋SpringBoot 2.1 | 第三十一篇:SpringBoot Reactor响应式编程实战一
  5. java jar包 资源_一个小坑:java如何访问依赖jar包中的资源文件
  6. 在构造函数中释放对象本身
  7. Ubuntu16.04运行清空文件命令时提示权限不够解决方法
  8. python字典用法总结
  9. python yield详解
  10. laravel 商城_Laravel使用初心