gpt4 book ai didi

python - 将一系列位传递给文件python

转载 作者:行者123 更新时间:2023-12-04 03:15:13 24 4
gpt4 key购买 nike

作为一个更大项目的一部分,我想在一个文件中保存一个位序列,以便文件尽可能小。我不是在谈论压缩,我想按原样保存序列,但使用最少的字符。最初的想法是使用 ASCII 编码将 8 位的迷你序列转换为字符并保存这些字符,但是由于奇怪字符的一些未知问题,读取文件时检索到的字符与最初写入的字符不同。我试过用 utf-8 编码打开文件,latin-1 但似乎都不起作用。我想知道是否有任何其他方法,也许将序列转换为十六进制数?

最佳答案

从技术上讲,您不能写入少于一个字节,因为操作系统以字节为单位组织内存 (write individual bits to a file in python),所以这是二进制文件 io,请参阅 https://docs.python.org/2/library/io.html有像 struct

这样的模块

使用'b' 开关打开文件,表示二进制读/写操作,然后使用即to_bytes() 函数(Writing bits to a binary file)或struct.pack() ( How to write individual bits to a text file in python? )

  with open('somefile.bin', 'wb') as f:

import struct
>>> struct.pack("h", 824)
'8\x03'

>>> bits = "10111111111111111011110"
>>> int(bits[::-1], 2).to_bytes(4, 'little')
b'\xfd\xff=\x00'

如果你想绕过内存的 8 位(字节)结构,你可以使用位操作位掩码BitArrayshttps://wiki.python.org/moin/BitManipulationhttps://wiki.python.org/moin/BitArrays

但是,正如您所说,问题是如果您使用不同长度的BitArrays 来读回数据,即要存储十进制数 7,您需要 3 位 0x111 来存储小数 2 你需要 2 位 0x10。现在的问题是读回这个。您的程序如何知道它是否必须将值作为 3 位值或 2 位值读回?在未组织的内存中,序列十进制 72 看起来像 11110转换为 111|10 那么您的程序如何知道 | 在哪里?

在正常的字节有序内存中,十进制 72 是 0000011100000010 -> 00000111|00000010 这样做的好处是很清楚 | 在哪里

这就是为什么最低级别的内存被组织成 8 位 = 1 字节的固定簇。如果你想访问字节/8 位簇内的单个位,你可以使用位掩码与逻辑运算符的组合(http://www.learncpp.com/cpp-tutorial/3-8a-bit-flags-and-bit-masks/)。在 python 中,单个位操作的最简单方法是模块 ctypes

如果你知道你的值都是 6 位的,也许值得付出努力,但这也很困难......

( How do you set, clear, and toggle a single bit? )

( Why can't you do bitwise operations on pointer in C, and is there a way around this? )

关于python - 将一系列位传递给文件python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com