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

1 importstruct2

3 a=12.34

4

5 #将a变为二进制

6

7 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而不是原来的浮点数了。

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

1 a='hello'

2

3 b='world!'

4

5 c=2

6

7 d=45.123

8

9 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中的类型一一对应。

FormatC TypePython字节数

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位系统,故而还提供了

CharacterByte orderSize 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 ..”长度错误,通常是由于字节对齐的缘故

python二进制数连接_python二进制处理详述(转)相关推荐

  1. python列表连接_Python连接列表

    python列表连接 Python join list means concatenating a list of strings with a specified delimiter to form ...

  2. python sftp连接_python 进行ftp服务器和sftp服务器连接

    1.背景. 最近接到一个任务,需要写一个python脚本,从客户公司的服务器拉取图片存放到我们公司的sftp服务器. 由于没头没脑,所以我采用无限遍历,将对方服务器中文件的路径原原本本的复制到我们公司 ...

  3. python修改二进制文件_python二进制修改bcwav文件

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #python二进制修改bcwav文件 # 批处理BAT以十六进制方式修改文件内容 # h ...

  4. python redis连接_Python连接Redis连接配置

    系统环境: OS:Oracle Linux Enterprise 5.6 redis:redis-2.6.8 python:Python-2.7.3 redis的python包版本:redis-2.7 ...

  5. python ssh连接_python 建立SSH连接发送指令

    import paramiko import select def link_server_client2(serverip, user, pwd): # 进行连接 print('---------- ...

  6. python 网络连接_python网络连接之tcp通信

    #encoding=utf-8 # 创建一个 TCP 服务器程序,这个程序会把客户发送过来的字 # 符串加上一个时间戳(格式:'[时间]数据')返回给客户. from socket import * ...

  7. python ping 连接_Python检查ping终端的方法

    菜鸟一枚,写着试了试,虽说有点杂乱,但还是能用,我是在linux下运行的 大致说下过程: 1.把需要ping的网段中所有ip存到数组中(我是放到数组中了,其实直接for循环,一个个的也行) 2.遍历数 ...

  8. python sftp连接_Python 脚本:创建SFTP连接传输数据

    以下脚本不一定能成功运行: 1.Python脚本, 需要pysftp包 #!/usr/bin/python # -*- coding: UTF-8 -*- import pysftp import o ...

  9. python 网络连接_python切换网络连接

    #coding=GB2312 import os import sys import subprocess import _winreg LOCAL_CONNECT_NAME = '本地连接' WIF ...

最新文章

  1. Centos8中恢复根目录为默认权限
  2. jquery 和js 还有 jq 挂事件
  3. Java并发:volatile内存可见性和指令重排
  4. Eclipse中SVN标记,提交人,时间等版本信息消失
  5. 在3D场景中显示汉字
  6. 软件工程导论 03章需求分析
  7. 自己做量化交易软件(45)小白量化实战18--直接使用通达信自编指标公式进行分析绘图和回测
  8. ARCore 之路:如何创建一个 ARCore 程序?
  9. 使用SpringSecurity 实现 OAuth2 资源服务器认证服务器分离( 注册码模式)
  10. #今日说码栏目#第四集 各类选择器
  11. (7)全民小视频引流脚本模块化开发01-关注用户By飞云脚本学院
  12. 由于目标计算机积极拒绝,无法连接。 Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接
  13. 英特尔计划发布代号为Spring Crest的神经网络处理器芯片,测试部署AI模型速度更快
  14. 错过了淘宝、拼多多,今年的电商风口抖音小店无货源你能抓住吗?
  15. 在 .NET 应用程序中运行 JavaScript
  16. zuul两大作用_springCloud学习- 路由网关(zuul)
  17. 2020TI省级大学生电子竞赛推荐芯片简介
  18. bing搜索分析网站的方法
  19. 小学用计算机画画 说课,体验电脑画画小学信息技术说课稿.docx
  20. Vue 中的 ref 属性详解

热门文章

  1. 论文被 scoop(抢先发表)是怎样一种体验?
  2. matlab中如何定义局部变量,转 MATLAB自定义函数及局部变量
  3. 使用Swift开发一个MacOS的菜单状态栏App
  4. 区块链早起打卡项目趣步模式
  5. 金字塔—演绎与归纳推理的区别
  6. oracle 分隔符 0x05,sqlserver2005导出到oracle10错误 0xc0202009: 数据流任务 ROW-00060
  7. 苹果pencil值得买吗?苹果平替电容笔排行榜
  8. 入侵报警的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. kubelet与api-server交互
  10. Linux中history命令显示时间