Python - 字节读/写和按位AND

时间:2012-02-01 17:14:56

标签: python byte

我认为Python足以编写基本的chip8模拟器,但看起来我错了。

我基本上在向内存读取/写入字节时遇到问题。 在程序的某个点上,我需要读取一个变量,我已经从文件读取并存储在列表中的单个字节。 这就是我从文件中读取的内容:

byte = rom.read(1)
memory.append(byte)
while byte:
    byte = rom.read(1)
    memory.append(byte)
rom.close()

在程序的某一点上,我需要从内存中获取一个字节,并且它将0x80移位某些数字(以提取单个位),所以我使用:

for i in range(h):
    p = ord(memory[addressI + i])
    for j in range(8):
        if(p & (0x80 >>j)) != 0:
        ...

它可以正常工作一段时间,但后来我无处可出现这个错误:

 (...)p = ord(memory[addressI + i])
 TypeError: ord() expected string of length 1, but int found

如果我根本不使用ord功能,我会收到此错误,如预期的那样:

TypeError: unsupported operand type(s) for &: 'str' and 'int'

我想我得到了这个错误,因为在程序的某个时刻我将存储值的BCD存储在内存中。我猜它会替换以前为int存储的字节类型。

data = registers[sNum>>8]
memory[addressI] = data/100
memory[addressI + 1] = (data/10) % 10
memory[addressI + 2] = data % 10

可能的解决方案是: 1 - 将“计算”为单个字节的int正确存储在“模拟”chip8内存的列表中 2 - 使用函数或奇迹代替ord()获取数据,并将其存储为单个字节

任何帮助将不胜感激。 顺便说一句,我正在使用Windows并在Python 2.7.2和3.2.2中测试了这段代码。

1 个答案:

答案 0 :(得分:1)

我认为将列表中的类型保持一致是最有意义的,通过将计算的整数传递给chr()函数(与{{1 }}):

ord()

然而,这是另一种选择,即创建一个函数,无论参数是data = registers[sNum>>8] memory[addressI] = chr(data/100) memory[addressI + 1] = chr((data/10) % 10) memory[addressI + 2] = chr(data % 10) 还是字节,都返回正确的函数。

int

然后将for循环中的行更改为:

ord_ = lambda c: c if isinstance(c, int) else ord(c)

所以现在如果列表中的项是整数,p = ord_(memory[addressI + i]) 将保持不变,但如果它是一个字节,那么它将返回ord_(memory[addressI + i])的结果。

编辑:由于您的阅读循环,列表中的空字符串可能存在,请尝试将其更改为以下内容:

ord()

这可以防止最后一次循环byte = rom.read(1) while byte: memory.append(byte) byte = rom.read(1) 返回空字符串,然后在检查rom.read(1)条件之前立即将其附加到memory的情况。