Python中如何将数据写入二进制文件

你正在为类Java的字节码构建一个汇编器。本质上,它是一个Python函数,它接受一个从包含操作码的文本文件中读取的字符串,并将编译后的二进制数据写入一个文件。下面是一个输入字符串(来自Example.txt)的示例:
在这里插入图片描述

class Example

Method add

meta
lva 4

code
0: ipush 1 0
1: ipush 2 2
2: iload 1
3: iload 2
4: iadd
5: istore 3
6: iload 3
7: ireturn

你的任务是将Example.txt文本文件转换成它的二进制表示(你的虚拟机的机器代码)。每个操作码(例如iadd)恰好一个字节长(即0到255范围内的数字)。一些操作码接受操作数,它们也一个字节长。

只将方法的操作码保存在二进制文件中非常容易。你可以将每个操作码解析成0到255范围内的数字,然后使用array.append(op),再使用array.tofile(handle)。

但是,你需要保存的不只是操作码,还包括诸如类名、方法名等数据。

如何将一个字节值和更复杂的数据保存到二进制文件中?

你设想是这样的…

该文件被分成几个部分。第一部分,例如,是类Example。下一部分是Method add开始的部分。

本质上,只有两种类型的部分,名称部分,它只包含类名,方法部分,它随后被细分为元数据部分和代码部分。

名称部分以00(十六进制)开头,然后需要呈现类的名称(这就是你的问题)。00本质上是类的十六进制表示。方法部分以FF开头,然后它们也需要在接下来的几个字节中呈现它们的名称。然后,可以在主方法部分内使用0F表示“元数据部分的开始”和F0表示“代码部分的开始”。

然而,仍然存在一个问题。如何命名这些部分?有一个想法是将“Example”中的每个字符转换成它的十六进制表示,一个字节,然后将它们保存在文件中的00或FF之后。这可能意味着你需要一些“部分结束”符号。

有没有一种更好/更简单/已经实现的方法来做到这一点?

  1. 解决方案
# -*- coding: utf-8 -*-

# 导入必要的库
import array
import struct
import io

# 创建一个二进制文件
binary_file = open("Example.bin", "wb")

# 创建一个数组对象,用于存储二进制数据
binary_data = array.array("B")

# 将类名写入二进制文件
class_name = "Example"
binary_data.frombytes(class_name.encode("utf-8"))

# 将方法名写入二进制文件
method_name = "add"
binary_data.frombytes(method_name.encode("utf-8"))

# 将元数据写入二进制文件
meta_data = "lva 4"
binary_data.frombytes(meta_data.encode("utf-8"))

# 将代码写入二进制文件
code = [
    0x00, 0x01, 0x00,
    0x01, 0x02, 0x02,
    0x02, 0x01,
    0x02, 0x02,
    0x03,
    0x03, 0x03,
    0x04,
    0x00
]
binary_data.frombytes(array.array("B", code))
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;

# 将二进制数据写入文件
binary_data.tofile(binary_file)

# 关闭二进制文件
binary_file.close()

这个Python程序将Example.txt文本文件转换为它的二进制表示。它使用array.array类来存储二进制数据,然后使用array.tofile()方法将二进制数据写入文件。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值