python二进制数连接_python二进制处理详述(转)
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二进制处理详述(转)相关推荐
- python列表连接_Python连接列表
python列表连接 Python join list means concatenating a list of strings with a specified delimiter to form ...
- python sftp连接_python 进行ftp服务器和sftp服务器连接
1.背景. 最近接到一个任务,需要写一个python脚本,从客户公司的服务器拉取图片存放到我们公司的sftp服务器. 由于没头没脑,所以我采用无限遍历,将对方服务器中文件的路径原原本本的复制到我们公司 ...
- python修改二进制文件_python二进制修改bcwav文件
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #python二进制修改bcwav文件 # 批处理BAT以十六进制方式修改文件内容 # h ...
- 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 ...
- python ssh连接_python 建立SSH连接发送指令
import paramiko import select def link_server_client2(serverip, user, pwd): # 进行连接 print('---------- ...
- python 网络连接_python网络连接之tcp通信
#encoding=utf-8 # 创建一个 TCP 服务器程序,这个程序会把客户发送过来的字 # 符串加上一个时间戳(格式:'[时间]数据')返回给客户. from socket import * ...
- python ping 连接_Python检查ping终端的方法
菜鸟一枚,写着试了试,虽说有点杂乱,但还是能用,我是在linux下运行的 大致说下过程: 1.把需要ping的网段中所有ip存到数组中(我是放到数组中了,其实直接for循环,一个个的也行) 2.遍历数 ...
- python sftp连接_Python 脚本:创建SFTP连接传输数据
以下脚本不一定能成功运行: 1.Python脚本, 需要pysftp包 #!/usr/bin/python # -*- coding: UTF-8 -*- import pysftp import o ...
- python 网络连接_python切换网络连接
#coding=GB2312 import os import sys import subprocess import _winreg LOCAL_CONNECT_NAME = '本地连接' WIF ...
最新文章
- Centos8中恢复根目录为默认权限
- jquery 和js 还有 jq 挂事件
- Java并发:volatile内存可见性和指令重排
- Eclipse中SVN标记,提交人,时间等版本信息消失
- 在3D场景中显示汉字
- 软件工程导论 03章需求分析
- 自己做量化交易软件(45)小白量化实战18--直接使用通达信自编指标公式进行分析绘图和回测
- ARCore 之路:如何创建一个 ARCore 程序?
- 使用SpringSecurity 实现 OAuth2 资源服务器认证服务器分离( 注册码模式)
- #今日说码栏目#第四集 各类选择器
- (7)全民小视频引流脚本模块化开发01-关注用户By飞云脚本学院
- 由于目标计算机积极拒绝,无法连接。 Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接
- 英特尔计划发布代号为Spring Crest的神经网络处理器芯片,测试部署AI模型速度更快
- 错过了淘宝、拼多多,今年的电商风口抖音小店无货源你能抓住吗?
- 在 .NET 应用程序中运行 JavaScript
- zuul两大作用_springCloud学习- 路由网关(zuul)
- 2020TI省级大学生电子竞赛推荐芯片简介
- bing搜索分析网站的方法
- 小学用计算机画画 说课,体验电脑画画小学信息技术说课稿.docx
- Vue 中的 ref 属性详解
热门文章
- 论文被 scoop(抢先发表)是怎样一种体验?
- matlab中如何定义局部变量,转 MATLAB自定义函数及局部变量
- 使用Swift开发一个MacOS的菜单状态栏App
- 区块链早起打卡项目趣步模式
- 金字塔—演绎与归纳推理的区别
- oracle 分隔符 0x05,sqlserver2005导出到oracle10错误 0xc0202009: 数据流任务 ROW-00060
- 苹果pencil值得买吗?苹果平替电容笔排行榜
- 入侵报警的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- kubelet与api-server交互
- Linux中history命令显示时间