将数字追加到字符串,但不作为ascii值

时间:2018-07-25 10:51:56

标签: python-3.x

我想从文件中读取字节并通过UDP发送。 下面是代码。在此代码中,blk_cntr设置为1。

     msg_temp='\x00'+'\x03'+'\x00'+blk_cntr+str(filedata[0:(blocksize*i)])

它给我错误“ TypeError:必须为str,而不是int”

当我将其更改为

       str(blk_cntr) 

然后没有错误,但是UDP压缩速率由ascii值1组成,我希望它是纯1而不是其ASCII值。

我也不确定

   str(filedata.....) 

我希望msg_temp为00 03 00 01等 是正确的方法。

1 个答案:

答案 0 :(得分:0)

我建议您查看struct库。手动组装二进制有效载荷不是很有趣。

假设您的数据包格式为big endian,并具有以下字段:

  • 16位整数
  • 16位整数
  • 可变长度字符串

您将执行以下操作:

>>> import struct
>>> data = struct.pack('>hh', 3, 1) + 'some_test_data'.encode('ascii')
>>> data
b'\x00\x03\x00\x01some_test_data'

如果要从文件读取此有效载荷数据,则需要对字符串进行编码,或打开文件进行二进制I / O。

编码字符串

为“ 文本模式”打开文件,I / O将在string上产生一个read()-如果t或{{调用b时,mode字符串中没有给出1}}。 要将返回的字符串与二进制数据(open())一起使用,必须对其进行编码。 常见的编码为bytesascii

utf-8

二进制I / O

或者,打开文件以进行二进制I / O-在调用$ echo -n "some_test_data" > data_file $ python3 Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import struct >>> data = struct.pack('>hh', 3, 1) >>> payload = open('data_file', 'r').read() >>> data += payload.encode('ascii') >>> data b'\x00\x03\x00\x01some_test_data' 时在b字符串中输入mode。 如果文件中包含任何二进制数据,这将是必需的。

open()