精华内容
下载资源
问答
  • 原因: 由于做项目需要,试图解析某网站的response过来的文件,一开始以为是GZIP后需要通过GZIP进行一次解压缩,然后上网查了半天用“GZIP解压缩...由于传输过来的是二进制字节流的格式,故可以直接采用python的zli...

    原因:

    由于做项目需要,试图解析某网站的response过来的文件,一开始以为是GZIP后需要通过GZIP进行一次解压缩,然后上网查了半天用“GZIP解压缩”的方法,各种转编码的方式都失败了。发现自己傻到家的发现,这个文件本来就不是.tar.gz的格式,而是xml的格式。只是存储的方式是二进制流字节的形式。

    解决方法

    由于传输过来的是二进制字节流的格式,故可以直接采用python的zlib库进行解压即可

    import zlib    
    result = zlib.decompress(doc)

     

    展开全文
  • 今天有一个问题就是需要将网络字节流或者是Image对象转化为二进制字节流数据,之后借助于base64模块实现编码最终...功能: Python PIL模块Image对象、字节流对象转二进制字节流 ''' import io import os import...

        今天有一个问题就是需要将网络字节流或者是Image对象转化为二进制字节流数据,之后借助于base64模块实现编码最终post到服务接口端,这里没有过多要去讲解的,直接看实现就行。

    #!usr/bin/env python
    # encoding:utf-8
    from __future__ import division
    
    '''
    __Author__:沂水寒城
    功能: Python PIL模块Image对象、字节流对象转二进制字节流
    '''
    
    
    import io
    import os
    import requests
    from PIL import Image
    import matplotlib.pyplot as plt
    
    
    
    def image2Binary():
        '''
        Image对象转化为二进制字节流对象
        '''
        img=Image.open('a.png')
        new=img.crop([0,67,400,340])
        plt.clf()
        plt.figure(figsize=(8,6))
        plt.subplot(1,2,1)
        plt.imshow(img)
        plt.title("original")
        plt.subplot(1,2,2)
        plt.imshow(new)
        plt.title("crop")
        plt.show()
        #图像文件可以从本地静态文件中直接读取为二进制字节流形式
        binary_str=open('a.png','rb').read()
        #已经被Image类读取成为Image对象后也可以转化为二进制字节流形式
        img_byte=io.BytesIO()
        new.save(img_byte,format='PNG')
        binary_str2=img_byte.getvalue()
        return binary_str,binary_str2
    
    
    def bytes2Binary():
        '''
        网络字节流数据转化为二进制节流对象
        '''
        url="https://a.png"  #测试图片url
        response=requests.get(url)
        #网络图像字节流数据可以直接被Image类转化为Image对象
        im=Image.open(io.BytesIO(response.content))
        img_byte=io.BytesIO()
        im.save(img_byte,format='PNG')
        binary_str=img_byte.getvalue()
        return binary_str
    
    
    
    
    if __name__ == '__main__':
        binary_str,binary_str2=image2Binary()
        binary_str=bytes2Binary()

     

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

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

    最近项目有个需求,需要对二进制文件读取内容,操作读取到的字节流数据,主要是查找与切片获取内容。这要求有两个标志,一个开始,一个结束,获取中间的内容。

    Python 的 bytes 内置了一些方法,但是却不完美。在调查后,了解到 bitstring 这个第三方包,在对字节流数据的处理上,似乎更合适。

    bytes

    bytes:一种字符序列的类型。通过比较 dir(str) 与 dir(bytes) 可知,两者的属性与方法很相似,只有少数几个不同。所以 bytes 也是可以像 string 一样,对字节序列有各种操作方法,如查找(find),求长度(len),切割(split),切片等。

    bytes 的优点是:Python 内置的方法,不需要的额外的安装三方模块。

    但缺点也很明显:只能单个查询,不能一次查询多个需要的结果。

    首先通过 open 的 rb 模式打开文件,读取内容为 bytes 类型。查找特定字符串有 find() 方法,但是此方法只能找到第一个符合要求的字符串索引,并且给出的不是单个位的索引,而是 8 位一个字节的索引。当需要查找多个符合的字符串,却没有内置的 findall() 方法。如果要查询多个,过程会麻烦,首先查到第一个符合的索引 1,以此索引 1 为开始,查询第二个符合的索引 2,以此类推,直到查询结束。

    with open(path, 'rb') as f:
        datas = f.read()
        start_char = datas.find(b'Start')
        # start_char2 = datas.find(b'Start', start_char)
        end_char = datas.find(b'End', start_char)
        # end_char2 = datas.find(b'End', start_char2)
        data = datas[start_char:end_char]
        print(data)
    

    注意上述代码,start_char 和 end_char 会出现多次,次数并不一定会一样,需要获取两个索引之间的内容,但是既无法循环,也不能一次查完。需要多次执行已注释的那行代码,获取关键字索引。由于不知道文件数据中会有多少个开始标志,也就不知道执行多少次,这应该采用循环解决,但似乎没有可供循环的变量。这使得问题更加复杂。

    其次,由于是获取两个标志之间的内容,所以,以上过程需要执行两遍。因此过程更显得繁杂无比。

    因此,寻找新的方法,是完全必要的。

    bitstring

    bitstring 是一个三方包,以字节流形式读取二进制文件。

    bitstring.py 文件的第一句话是:This package defines classes that simplify bit-wise creation, manipulation and interpretation of data.

    翻译如下:这个包定义的类简化了数据的逐位创建、操作和解释。

    简单理解就是,直接操作 bytes 类型的数据。

    有主要的四个类,如下:

    Bits -- An immutable container for binary data.
    BitArray -- A mutable container for binary data.
    ConstBitStream -- An immutable container with streaming methods.
    BitStream -- A mutable container with streaming methods.
    
    Bits -- 二进制数据的不可变容器。
    BitArray -- 二进制数据的可变容器。
    ConstBitStream -- 具有流方法的不可变容器。
    BitStream -- 具有流方法的可变容器。
    

    像 bytes 一样,首先读取文件内容,查找关键字索引,切片获取数据内容。

    from bistring import ConstBitStream, BitStream
    
    hex_datas = ConstBitStream(filename=path)  # 读取文件内容
    start_char = b'Start'
    start_chars = hex_datas.findall(start_char, bytealigned=True)  # 一次找到全部符合的,返回一个生成器
    start_indexs = []
    for start_char in start_chars:
        start_indexs.append(start_char)
    
    end_char = b'End'
    end_indexs = []
    for start_index in start_indexs:
        end_chars = hex_datas.find(end_char, start=start_index, bytealigned=True)  # 找到第一个符合的,返回元组
        for end_char in end_chars:
            end_indexs.append(end_char)
    
    result = []
    for i in range(min(len(start_indexs), len(end_indexs))):
        hex_data = hex_datas[start_indexs[i]:end_indexs[i]]
        str_data = BitStream.tobytes(hex_data).decode('utf-8')
        result.append(str_data)
    

    代码分析,首先导入需要的两个类:ConstBitStream, BitStream。获取文件内容,findall() 查找所有符合的字符串索引,find() 查找第一个符合的字符串索引。取开始、结束两个列表的较小值,切片获取数据,类型为 ‘bitstring.ConstBitStream’,BitStream.tobytes() 方法转为 bytes 类型,中文字符会乱码,所以再用 decode() 解码,得到需要的字符串。

    整个过程还是简洁、连续。代码中用到了 findall()、find()、tobytes() 方法。此外还有许多小细节需要注意,比如,start_indexs 如果为空,后续的代码就不该执行了,end_indexs 为空亦是如此。

    由此可见,bitstring 这个包还是比较好用的。根据需求,用到的方法比较少,其实还有许多其他的方法,按需选择。

    展开全文
  • 刚学习PYQT,这里需要用Python进行数据 通信,有几个常用功能。我们的上位机软件里的变量往往都是整型、浮点...struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型。 可以把这里的

    刚学习PYQT,这里需要用Python进行数据 通信,有几个常用功能。我们的上位机软件里的变量往往都是整型、浮点型、字符串等等,但是我们在数据传输的过程中,往往需要的是ByteArray格式。
    这里有两组非常重要的方法:struct.pack()和struct.unpack,以及encode()和decode();

    下面逐一进行讲解:

    struct.pack个人感觉常用于数值型。
    struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型。
    可以把这里的字符串理解为字节流,或字节数组。
    其函数原型为:struct.pack(fmt, v1, v2, …),
    参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。
    v1, v2, …表示要转换的python值。下面的例子将两个整数转换为字符串(字节流):

    import struct   
      
    a = 20  
    b = 400  
      
    str = struct.pack("ii", a, b)  #转换后的str虽然是字符串类型,但相当于其他语言中的字节流(字节数组),可以在网络上传输   
    print 'length:', len(str)   
    print str   
    print repr(str)  
    
    #---- result   
    #length: 8   
    # 乱码
    #'/x14/x00/x00/x00/x90/x01/x00/x00'  
    

    格式符"i"表示转换为int,'ii’表示有两个int变量。进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节),可以看到输出的结果是乱码。因为结果是二进制数据,所以显示为乱码。可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的0x00000014, 0x00001009分别表示20和400。用的小端法。

    struct.unpack
    struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt, string),该函数返回一个元组。 下面是一个简单的例子:

    str = struct.pack("ii", 20, 400)   
    a1, a2 = struct.unpack("ii", str)   
    print 'a1:', a1   
    print 'a2:', a2   
      
    #---- result:   
    #a1: 20   
    #a2: 400  
    

    encode()函数个人感觉常用语字符串型。
    Python3严格区分文本(str)和二进制数据(Bytes),文本总是Unicode,用str类型,二进制数据则用Bytes类型表示,这样严格的限制也让我们对如何使用它们有了清晰的认识。
    在这里插入图片描述
    描述:以指定的编码格式编码字符串,默认编码为 ‘utf-8’。

    语法:str.encode(encoding=‘utf-8’, errors=‘strict’) -> bytes (获得bytes类型对象)

    encoding 参数可选,即要使用的编码,默认编码为 ‘utf-8’。字符串编码常用类型有:utf-8,gb2312,cp936,gbk等。
    errors 参数可选,设置不同错误的处理方案。默认为 ‘strict’,意为编码错误引起一个UnicodeEncodeError。 其它可能值有 ‘ignore’, ‘replace’, 'xmlcharrefreplace’以及通过 codecs.register_error() 注册其它的值。

    str1 = "我爱祖国"
    str2 = "I love my country"
    print("utf8编码:",str1.encode(encoding="utf8",errors="strict")) #等价于print("utf8编码:",str1.encode("utf8"))
    print("utf8编码:",str2.encode(encoding="utf8",errors="strict"))
    print("gb2312编码:",str1.encode(encoding="gb2312",errors="strict"))#以gb2312编码格式对str1进行编码,获得bytes类型对象的str
    print("gb2312编码:",str2.encode(encoding="gb2312",errors="strict"))
    print("cp936编码:",str1.encode(encoding="cp936",errors="strict"))
    print("cp936编码:",str2.encode(encoding="cp936",errors="strict"))
    print("gbk编码:",str1.encode(encoding="gbk",errors="strict"))
    print("gbk编码:",str2.encode(encoding="gbk",errors="strict"))
    
    utf8编码: b'\xe6\x88\x91\xe7\x88\xb1\xe7\xa5\x96\xe5\x9b\xbd'
    utf8编码: b'I love my country'
    gb2312编码: b'\xce\xd2\xb0\xae\xd7\xe6\xb9\xfa'
    gb2312编码: b'I love my country'
    cp936编码: b'\xce\xd2\xb0\xae\xd7\xe6\xb9\xfa'
    cp936编码: b'I love my country'
    gbk编码: b'\xce\xd2\xb0\xae\xd7\xe6\xb9\xfa'
    gbk编码: b'I love my country'
    
    a = '编码测试'
     
    #使用不同的编码格式给a进行编码
    b = a.encode('utf-8')
    c = a.encode('gb2312') #发现gb2312和gbk结果一样
    d = a.encode('gbk')
    print(type(b),b)
    print(type(c),c)
    print(type(d),d)
    '''
    <class 'bytes'> b'\xe7\xbc\x96\xe7\xa0\x81\xe6\xb5\x8b\xe8\xaf\x95'
    <class 'bytes'> b'\xb1\xe0\xc2\xeb\xb2\xe2\xca\xd4'
    <class 'bytes'> b'\xb1\xe0\xc2\xeb\xb2\xe2\xca\xd4'
    '''
    #使用不同的解码方式解码
    b1 = b.decode('utf-8')
    c1 = c.decode('gb2312')
    d1 = d.decode("gbk")
    b11 = b.decode('gbk')  #b本来是用utf-8编码,现在用gbk进行解码,出现乱码的情况
    print(type(b1),b1)
    print(type(c1),c1)
    print(type(d1),d1)
    print(type(b11),b11)  #b本来是用utf-8编码,现在用gbk进行解码,出现乱码的情况
    '''
    <class 'str'> 编码测试
    <class 'str'> 编码测试
    <class 'str'> 编码测试
    <class 'str'> 缂栫爜娴嬭瘯
    '''
    
    展开全文
  • 首先导入所需的包:import structstruct有以下几个主要的函数:# 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)pack(fmt, v1, v2, ...)# 按照给定的格式(fmt)解析字节流string,返回解析...
  • 注:教程中以下四个名词同义:二进制流、二进制数组、字节流、字节数组 在struct模块中,将一个整型数字、浮点型数字或字符流(字符数组)转换为字节流(字节数组)时,需要使用格式化字符串fmt告诉struct模块被转换...
  • Ajax 二进制字节流数据的发送和接收

    千次阅读 2016-05-24 10:25:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 前言 前段时间使用Python解析IDX文件格式的MNIST数据集,需要对...注:教程中以下四个名词同义:二进制流、二进制数组、字节流、字节数组 快速上手 在struct模块中,将一个整型数字、浮点型数字或字
  • # 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple unpack(fmt, string) # 计算给定的格式(fmt)占用...
  • 在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,这篇文章就主要介绍了Python中struct模块对字节流/二进制流的操作,需要的朋友可以参考借鉴。
  • python操作二进制流

    千次阅读 2014-01-09 00:37:02
    python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用struct来处理c语言中的结构体. struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, ...
  • Python 二进制文件转浮点

    千次阅读 2018-09-19 01:16:19
    # 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple unpack(fmt, string) # 计算给定的格式(fmt...
  • pack: 将Python中的数据打包成二进制字节流 unpack: 将字节流解包成Python中的数据 import struct # values 包含一个9字节的字节串、一个整数、以及一个浮点数。 values = ("夏色祭".encode("utf-8"), 16, 156.7) ...
  • KonFoo是一个Python软件包,用于以声明性的方式创建字节流映射器,所需的代码更少,从而有助于消除所有众所周知的内存转储的foo或二进制数据的十六进制视图的混淆。 它具有开箱即用的明智默认设置。 它旨在使从...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 处理二进制文件或者从网络接收字节流时,字节流中的结构化数据可能存在二进制有符号数。虽然开发者根据字节流协议可以先验的知道有符号数的字节序、字长、符号位等信息,但在使用Python进行类型转换时缺少将这些信息...
  • python-二进制读写存取

    千次阅读 2017-07-21 11:41:45
    python的pickle模块可以很方便的进行序列化的操作,将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它。但是当我们直接使用pickle的时候,保存的字节流无法被例如C等...
  • Python 图像与二进制格式、 str 与byte之间转换 图像转换为二进制 图像转换为二进制主要是方便数据传输,比如在web开发中,将数据从客户端...通过url读取图像并且转换为二进制字节流from urllib import request ima...
  • Python读写二进制文件

    千次阅读 2012-08-30 19:31:43
    读: file模式'rb' import binascii s_16 = binascii.b2a_hex(f.read(1))#2--->16 ...f.write(struct.pack('B',int(s_16,16)))#16--->10,此处若不将16进制数据转换成10进制在转换成字节流直接写进文件的话,
  • 使用python的struct模块来处理二进制数据。 struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) ...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 295
精华内容 118
关键字:

python二进制字节流

python 订阅