如何在python中打包两字节数组并从文件中写入/读取

如何在python中打包两字节数组并从文件中写入/读取,python,struct,memoryview,Python,Struct,Memoryview,假设我有字节格式的键和值。我需要将此信息写入文件,然后将其读回以便重播。最简单的方法是写len(key)| key | len(value)|值等等。我正在尝试使用python memoryview和struct编写此逻辑 pack_into in struct模块只接受整数形式的输入 import sys from struct import * from ctypes import * buf = create_string_buffer(16) key = b'<some data

假设我有字节格式的键和值。我需要将此信息写入文件,然后将其读回以便重播。最简单的方法是写len(key)| key | len(value)|值等等。我正在尝试使用python memoryview和struct编写此逻辑

pack_into in struct模块只接受整数形式的输入

import sys
from struct import *
from ctypes import *

buf = create_string_buffer(16)
key = b'<some data in hex>'
value = b'<some data in hex>
pack_into("@QQ",buf,0,key,value)
struct.error: required argument is not an integer
导入系统 从结构导入* 从ctypes导入* buf=创建字符串缓冲区(16) 键=b'' 值=b' 打包成(“@QQ”,buf,0,键,值) struct.error:必需的参数不是整数
我找不到解决这个问题的办法。请帮我解决这个问题。

您不需要
ctypes
struct
。只需以二进制模式打开文件,然后就可以直接写入和读取字节

演示:

输出

b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'  
test.dat的hextump

b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'  
00000000 01 02 03 04 05 06 07 08 f8 f9 fa fb fc fd fe ff||
00000010

您不需要使用
ctypes
struct
。只需以二进制模式打开文件,然后就可以直接写入和读取字节

演示:

输出

b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'  
test.dat的hextump

b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
b'\x01\x02\x03\x04\x05\x06\x07\x08' b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'  
00000000 01 02 03 04 05 06 07 08 f8 f9 fa fb fc fd fe ff||
00000010

您可以简单地
pickle.dump()
这个
(键,值)
元组。然后用
pickle.load()

读回它,您也许可以简单地
pickle.dump()
这个
(键,值)
元组。然后用pickle.load()读回它。

Q格式字符意味着要将python整数打包为C无符号长整型整数。这与我的想法大不相同。你能提供数据示例吗?考虑关键是字节格式键= b’\x01\x03\x03\x04\x05\x06\x07\x08,而且值也在字节B′\x01\x02\x03\x04\x05\x06\x07\x08′中,长度9268(它可能会变化)。现在,我正试图将这些内容写入文件,并需要在卡夫卡重播中读取相同的内容。我知道以字节格式读取和写入文件。我无法理解如何设置偏移量?什么是“卡夫卡中的重播”意思?Q格式字符表示您希望将python整数打包为C无符号长整数。这与我的想法大不相同。你能提供数据示例吗?考虑关键是字节格式键= b’\x01\x03\x03\x04\x05\x06\x07\x08,而且值也在字节B′\x01\x02\x03\x04\x05\x06\x07\x08′中,长度9268(它可能会变化)。现在,我正试图将这些内容写入文件,并需要在卡夫卡重播中读取相同的内容。我知道以字节格式读取和写入文件。我无法得到图片如何设置偏移量?什么是“卡夫卡重放”的意思?这将只工作,如果关键点和值是固定长度。这个答案的解决方案是写入长度(key)| key | length(value)| value。我正在尝试使用文件输入输出f.seek(offset,from|what)写入逻辑。使用struct和memoryview应该有更好的方法来解决这个问题。@user128956抱歉,我不理解您的第二条评论。这只有在键和值的长度固定时才有效。这个答案的解决方案是写入长度(key)| key | length(value)| value。我正在尝试使用文件输入输出f.seek(offset,from|what)写入逻辑。使用struct和memoryview应该有更好的方法来解决这个问题。@user128956抱歉,我不理解您的第二条评论。