2012-02-01 48 views
1

我认为我知道Python足以编程一个基本的chip8仿真器,但似乎我错了。Python - 字节读/写和按位与

我基本上有问题来读/写字节和内存。 在程序的某个点上,我需要读取一个变量,我已经从一个文件中读取了一个字节并存储在一个列表中。 这是我从文件中读取:

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 funcion我得到这个错误,因为EXPEC特德:

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 - 妥善保存在列表中的单字节计算,“模仿”的chip8内存INT 2 - 使用功能或一个奇迹,而不是ORD()即得到什么该数据是并将其作为单个字节存储

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

+1

“你做错了” - 首先,请使用蟒蛇阵列而不是列表中的内存来保存你的数据。数组被命名为“阵”标准库模块中 – jsbueno 2012-02-01 17:27:52

+1

嘛,你自己找出问题所在,并提出有效的解决方案,所以我不知道你的问题是什么。我会做的只是将数字存储在内存列表/数组中。 – interjay 2012-02-01 17:30:20

+0

@jsbueno嗯,我想我会试试看。 – 2012-02-01 18:47:11

回答

1

我认为这是很有道理的通过传递你正在计算进入chr()功能(这是ord()反向)的整数,以保持在列表中的类型相一致,你可以很容易做到:

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

但是,这是一个替代方案,它是创建一个函数,返回正确的参数是否是int或一个字节。

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

,然后更改线在你的for循环这样的:

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)最后一次返回一个空字符串,然后在检查while条件之前立即将其附加到memory

+0

我真的认为你的解决方案可行,但不幸的是,它没有。现在我得到一个像“TypeError:ord()期望的字符,但长度为0的字符串”的错误。谢谢。 – 2012-02-01 18:45:56

+0

@ BrunoO.c。 - 看我的编辑,我想你读循环是空字符串的原因。 – 2012-02-01 19:24:26

+0

谢谢,它现在有效。我正准备用另一种语言重写我的整个代码。 – 2012-02-02 01:18:04