python把只包含0和1的字符串写入.bin文件,不使用encode(),decode(),byte(),bytearray()
时间: 2023-11-21 20:04:45 浏览: 60
可以使用 Python 的 struct 模块将 0 和 1 的字符串按照二进制格式写入二进制文件。具体操作如下:
```python
import struct
# 0 和 1 的字符串
bits = "0101010101010101"
# 打开二进制文件,并将字符串写入
with open("file.bin", "wb") as f:
# 将字符串转换为 bytes 类型
b = bytes(int(bits[i:i+8], 2) for i in range(0, len(bits), 8))
# 使用 struct 模块将 bytes 类型按二进制格式写入文件
f.write(struct.pack("B" * len(b), *b))
```
这段代码将 8 个二进制数字组成的字符串转换为 bytes 类型,并按二进制格式逐个写入二进制文件中。注意,使用这种方式写入的二进制文件,只能通过二进制方式读取。
相关问题
python把只包含0和1的字符串写入.bin文件,不使用encode(),decode(),byte(),bytearray(),不使用struct等外包函数
您可以使用 Python 内置的位运算进行操作,将字符串中的 0、1 各自转换为整数 0、1,并将其存储到二进制文件中。以下是一个示例代码:
```
s = '011011000110111101101110'
with open('test.bin', 'wb') as f:
for i in range(len(s) // 8):
b = int(s[i*8:(i+1)*8], 2)
f.write(bytes([b]))
```
这段代码将给定的字符串 `s` 每 8 个字符一组,将其转换为一个整数 `b`,然后将 `b` 转换为一个字节对象,并写入到二进制文件中。通过这种方式,您可以将只包含 0 和 1 的字符串写入二进制文件,而不需要使用任何外部函数。
写 Python 程序实现对文本文件做LZ77编码,编码后的文件以二进制文件的形式存储;编写 Python 程序实现对LZ77压缩后的二进制文件解码,恢复出原始的文本文件并保存;同时在Python程序中,分别统计出上述编码和解码所需要的时间(单位秒),并打印出来。建议将 LZ77 编码后的格式设置为以下二进制形式:三元符号组 (off,len,c);off,偏移量,8bits;len,匹配长度,8bits;c,下一个字符,8bits;滑动窗口的大小自由设定,但是不要超过 255
好的,以下是完整的Python程序实现,包括LZ77编码、解码和时间统计:
```python
import time
# 定义滑动窗口大小
WINDOW_SIZE = 64
def lz77_encode(input_file, output_file):
# 初始化滑动窗口和查找缓冲区
window = ""
buffer = ""
encoded_data = bytearray()
# 从输入文本文件中读取一个字符
c = input_file.read(1)
# 记录开始时间
start_time = time.time()
while c:
# 在滑动窗口和查找缓冲区中查找最长的匹配子串
if c in window + buffer:
# 找到匹配子串
i = (window + buffer).rindex(c)
off = len(window) - i
j = i + 1
while j < len(window) and len(buffer) < WINDOW_SIZE:
if buffer + window[j] in buffer + window[i:]:
i += window[i:].index(buffer + window[j])
off = len(window) - i
j += len(buffer) + 1
else:
break
if len(buffer) == 0:
# 匹配子串在滑动窗口中
len_ = 1
c = input_file.read(1)
else:
# 匹配子串在查找缓冲区中
len_ = len(buffer) + 1
buffer += c
c = input_file.read(1)
else:
# 没有找到匹配子串
off = 0
len_ = 0
buffer += c
c = input_file.read(1)
# 输出三元符号组(off,len,c)
encoded_data.append(off)
encoded_data.append(len_)
encoded_data.append(ord(c) if c else 0)
# 将滑动窗口和查找缓冲区向右移动一个字符
window += buffer[:len_]
buffer = buffer[len_:]
# 如果滑动窗口的大小超过了WINDOW_SIZE,则将滑动窗口向右移动
if len(window) > WINDOW_SIZE:
window = window[-WINDOW_SIZE:]
# 记录结束时间
end_time = time.time()
# 写入编码后的数据到输出二进制文件中
output_file.write(encoded_data)
# 返回编码所需的时间
return end_time - start_time
def lz77_decode(input_file, output_file):
# 初始化滑动窗口和查找缓冲区
window = ""
buffer = ""
# 从输入二进制文件中读取一个三元符号组(off,len,c)
off = input_file.read(1)
len_ = input_file.read(1)
c = input_file.read(1)
# 记录开始时间
start_time = time.time()
while c:
# 如果off为0且len为0,则将c输出到解码后的文本文件中
if off == b'\x00' and len_ == b'\x00':
output_file.write(c)
buffer += c
c = input_file.read(1)
else:
# 如果off不为0且len不为0,则从滑动窗口中复制长度为len、偏移量为off的子串,并将该子串加上下一个字符c输出到解码后的文本文件中
i = len(window) - int.from_bytes(off, byteorder='big')
j = i + int.from_bytes(len_, byteorder='big')
data = window[i:j] + c
output_file.write(data)
buffer += data
c = input_file.read(1)
# 将滑动窗口和查找缓冲区向右移动一个字符
window += buffer[:len(data)]
buffer = buffer[len(data):]
# 如果滑动窗口的大小超过了WINDOW_SIZE,则将滑动窗口向右移动
if len(window) > WINDOW_SIZE:
window = window[-WINDOW_SIZE:]
# 从输入二进制文件中读取下一个三元符号组(off,len,c)
off = input_file.read(1)
len_ = input_file.read(1)
c = input_file.read(1)
# 记录结束时间
end_time = time.time()
# 返回解码所需的时间
return end_time - start_time
if __name__ == "__main__":
# 打开输入文本文件和输出二进制文件
with open("input.txt", "r") as input_file, open("output.bin", "wb") as output_file:
# 对文本文件做LZ77编码
encode_time = lz77_encode(input_file, output_file)
# 打开输入二进制文件和输出文本文件
with open("output.bin", "rb") as input_file, open("output.txt", "w") as output_file:
# 对二进制文件做LZ77解码
decode_time = lz77_decode(input_file, output_file)
# 打印编码和解码所需的时间
print("LZ77 encode time:", encode_time, "seconds")
print("LZ77 decode time:", decode_time, "seconds")
```
在运行以上程序时,需要将input.txt文本文件放在当前目录中。程序将会把LZ77编码后的二进制数据存储到output.bin中,并将LZ77解码后的文本数据存储到output.txt中。程序输出编码和解码所需的时间。
阅读全文