精华内容
下载资源
问答
  • 主要介绍了Ajax发送和接收二进制字节流数据的方法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
  • 刚学习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'> 缂栫爜娴嬭瘯
    '''
    
    展开全文
  • C# 二进制字节流读写封装

    千次阅读 2017-05-16 19:41:31
    只针对内存字节流的读写,主要应用于数据的解析和写入。提供不同数据类型的读写接口,包括byte,short,int,float,string等。处理了大小端数据转换的问题,所以可用于网络数据的解析和发送。 using System.IO...

    完成以下功能:

    • 只针对内存字节流的读写,主要应用于数据的解析和写入。
    • 提供不同数据类型的读写接口,包括byte,short,int,float,string等。
    • 处理了大小端数据转换的问题,所以可用于网络数据的解析和发送。

    using System.IO; 
    using System.Net;
    using System;
    
    namespace Framework
    {
    	public class NetStream
    	{
    		private MemoryStream stream;
    		private BinaryReader reader;
    		private BinaryWriter writer;
    
    		public NetStream(byte[] buffer = null)
    		{
    			if (buffer == null)
    			{
    				this.stream = new MemoryStream();
    			}
    			else
    			{
    				this.stream = new MemoryStream(buffer);
    			}
    
    			this.reader = new BinaryReader(this.stream);
    			this.writer = new BinaryWriter(this.stream);
    		}
    
    		public void Close()
    		{
    			this.stream.Close();
    			this.reader.Close();
    			this.writer.Close();
    		}
    
    //-------------------------------------------------------------------------------
    
            public long ReadInt64()
    		{
    			return IPAddress.HostToNetworkOrder(this.reader.ReadInt64());
    		}
    
    		public int ReadInt32() 
    		{
    			return IPAddress.HostToNetworkOrder(this.reader.ReadInt32());
    		}
    
    		public short ReadInt16() 
    		{
    			return IPAddress.HostToNetworkOrder(this.reader.ReadInt16());
    		}
    
    		public byte ReadByte()
    		{
    			return this.reader.ReadByte();
    		}
    
            public float ReadFloat()
            {
                return this.reader.ReadSingle();
            }
    
            public string ReadString8() 
    		{
    			return System.Text.Encoding.UTF8.GetString(this.reader.ReadBytes(ReadByte()));
    		}
    
    		public string ReadString16() 
    		{
    			return System.Text.Encoding.UTF8.GetString(this.reader.ReadBytes(ReadInt16()));
    		}
    
    		public long Seek(long offset)
    		{
    			return this.stream.Seek(offset, SeekOrigin.Begin);
    		}
    
    //-------------------------------------------------------------------------------
    
    		public void WriteByte(byte value)
    		{
    			this.writer.Write(value);
    		} 
    
    		public void WriteInt16(short value)
    		{
    			this.writer.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value)));
    		}
    
    		public void WriteInt32(int value)
    		{
    			this.writer.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value)));
    		}
    
    		public void WriteInt64(long value)
    		{
    			this.writer.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value)));
    		}
    
            public void WriteFloat(float value)
            {
                this.writer.Write(value);
            }
    
            public void WriteString8(string value)
    		{
    			byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(value);
    
    			WriteByte((byte) byteArray.Length);
    
    			this.writer.Write(byteArray);
    		}
    
    		public void WriteString16(string value)
    		{
    			byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(value);
    
    			WriteInt16((short) byteArray.Length);
    
    			this.writer.Write(byteArray);
    		}
    
    		public byte[] GetBuffer()
    		{
    			return this.stream.ToArray();
    		}
    
    		public int GetLength()
    		{
    			return (int) this.stream.Length;
    		}
    	}
    }
    
    


    展开全文
  • C#读取二进制字节流

    千次阅读 2019-07-09 17:01:36
    1、以下方法将一个对象序列化为可以在数据库中存储的字节数组 private byte[] getByteData(SupplementData data) { BinaryFormatter serializer =new BinaryFormatter(); MemoryStream memStream =new ...
    1、以下方法将一个对象序列化为可以在数据库中存储的字节数组
    private byte[] getByteData(SupplementData data)
      {
       BinaryFormatter serializer =new BinaryFormatter();
       MemoryStream memStream =new MemoryStream();
       serializer.Serialize(memStream,data);
       int length = (int)memStream.Length;
       byte[] buffer = new byte[length];
       memStream.Position = 0;
       memStream.Read(buffer,0,length);
       return buffer;
      }
    调用方法得到字节数组后给参数赋值:
    oCommand.Parameters[5].Value =getByteData(OldData);
    2、以上是关于序列化后的字节数组的存储,那读取呢?

      private SupplementData GetHistoryData(string Track_UUID)
      {
       //根据ID得到一笔记录,GetTable是本人系统中的特定方法
       DataTable table = GetTable("LIC_DATA_TRACK","TRACK_UUID",Track_UUID,out sErrorMsg);

       BinaryFormatter deserializer =new BinaryFormatter();
       MemoryStream stream =new MemoryStream();
       //将得到的记录中的某个Bolb类型的数据读出来存储到数据流中
       byte[] objBytes =(byte[])table.Rows[0]["HistoryData"];
     
      stream.Write(objBytes,0,objBytes.Length);
       stream.Position = 0;
       //字节流反序列化后,返回对象SupplementData(本人定义的一个对象)
       return (SupplementData)deserializer.Deserialize(stream);
      }


    转载于:https://www.cnblogs.com/Bluer/archive/2007/12/05/983224.html

    展开全文
  • 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 这个包还是比较好用的。根据需求,用到的方法比较少,其实还有许多其他的方法,按需选择。

    展开全文
  • 主要介绍了 HttpClient Post 二进制/字节流/byte[]实例代码的相关资料,需要的朋友可以参考下
  • 在进行数据传输时(socket等等),往往需要使用二进制字节流进行传输。 字符串转换为二进制字节流 String ori = "待转换的字符串"; ori = ori.getBytes(StandardCharsets.UTF_8); 二进制字节流转换为字符串 ...
  • 原因: 由于做项目需要,试图解析某网站的response过来的文件,一开始以为是GZIP后需要通过GZIP进行一次解压缩,然后上网查了半天用“GZIP解压缩...由于传输过来的是二进制字节流的格式,故可以直接采用python的zli...
  • Python PIL模块Image对象、字节流对象转二进制字节流

    千次阅读 热门讨论 2020-08-13 10:46:34
    今天有一个问题就是需要将网络字节流或者是Image对象转化为二进制字节流数据,之后借助于base64模块实现编码最终post到服务接口端,这里没有过多要去讲解的,直接看实现就行。 #!usr/bin/env python # encoding:...
  • Java字节、二进制字节流、字符

    万次阅读 2019-06-22 00:16:39
    Java字节、二进制字节流、字符
  • GB2312-80编码的编码范围是高位0xa1-0xfe,低位是 0xa1-0xfe ,其中汉字范围为 0xb0a1 和 0xf7fe,如果只是简单地判断汉字,则只要查看高字节是否大于等于0xa1就可以了,还有就是,全角字符的高字节统统等于0...
  • js发送和接收二进制字节流数据

    万次阅读 2018-09-25 15:58:42
    发送二进制数据 var oReq = new XMLHttpRequest(); oReq.open(&quot;POST&quot;, url, true); oReq.onload = function (oEvent) { // Uploaded. }; var blob = new Blob(['abc123'], {type: 'text/plain'})...
  • 代码: void MainWindow::on_sj_pushButton_clicked() { QString ip_dest; ip_dest = ui->ip_lineEdit->text(); qint16 port_dest = ui->port_lineEdit->text().toInt();... QByteArray b
  • 怎样使图片字节转化为字符串,有相关的操作说明
  • 字节(byte)、二进制字节流、字符流相关概念分析

    万次阅读 多人点赞 2016-07-29 16:12:19
    因为计算机通信和存储的时候都是以010101这样的二进制数据为基础的,这儿的一个0和1占的地方就叫bit(位),即一个二进制位。 1Byte=8bit 1KB=1024B 1MB=1024KB(2的十次方) 2.二进制  二进制数有两个特点:它由两...
  • 二进制文件和字节流

    千次阅读 2019-02-24 16:40:34
    本节我们介绍在Java中如何以二进制字节的方式来处理文件,上节我们提到Java中有的概念,以二进制方式读写的主要有: InputStream/OutputStream: 这是基类,它们是抽象类。 FileInputStream/FileOutputStream: ...
  • http post方式发送二进制数据数据

    热门讨论 2015-01-21 18:12:01
    http post方式发送二进制数据到http服务端
  • 步:打开并读取文件中的文本 示例代码如下:read.c #include #include #include #include #include int main() { int fd = open("data",O_RDONLY,0444); if(fd == -1)perror("open"),exit(0); ...
  • 注:教程中以下四个名词同义:二进制流、二进制数组、字节流、字节数组 在struct模块中,将一个整型数字、浮点型数字或字符流(字符数组)转换为字节流(字节数组)时,需要使用格式化字符串fmt告诉struct模块被转换...
  • php图片转换二进制数据

    千次阅读 2018-12-12 10:14:45
    /* 图片转化为二进制数据 */ function binaryEncodeImage($img_file) { $p_size = filesize($img_file); $img_binary = fread(fopen($img_file, "r"), $p_size); return $img_binary; } /* 二进制...
  • Ajax 二进制字节流数据的发送和接收

    千次阅读 2016-05-24 10:25:00
    但实际上,Ajax可以字节发送二进制数据。 发送二进制数据 var oReq = new XMLHttpRequest(); oReq.open("POST", url, true); oReq.onload = function (oEvent) { // Uploaded. }; var blob = new Blob(['abc...
  • 前端处理二进制文件 这个需求其实做了很久了,但是今天突然被人问起,自己却不知所措,表达不完整,所以想重新梳理一下。 问题叙述 : 有时候需要点击一个 按钮 ,实现文件下载 ,而后端返回的数据为二进制流数据...
  • redis存储二进制数据测试代码
  • 使用redisCommandArgv借口操作redis,演示了如何用redis存取二进制数据或者带有空格的文本数据(这个类在我的聊天室里用的).
  • HTTP 请求工具类(含HTTPS)(参数、二进制流、文件、图片)
  • C# 二进制字节流查找函数IndexOf

    千次阅读 2014-05-08 09:19:57
    C# 二进制字节流查找函数IndexOf /// /// 报告指定的 System.Byte[] 在此实例中的第一个匹配项的索引。 /// /// 被执行查找的 System.Byte[]。 /// 要查找的 System.Byte[]。 /// 如果找到该字节数组,则为 ...
  • 文章目录java中以二进制方式读写的主要有:1. InputStream/OutputStream1.1 InputStream java中的文件主要分为两大类,一类按照二进制的方式处理文件;另一类按照文本的方式处理; 其中,按照二进制方式进行处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 203,898
精华内容 81,559
关键字:

二进制字节流