【问题标题】:Python - byte read/write and bitwise ANDPython - 字节读/写和按位与
【发布时间】:2012-02-01 17:14:56
【问题描述】:

我认为我对 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 中测试了这段代码。

【问题讨论】:

  • “你做错了” - 首先,请使用 python 数组而不是列表来将数据保存在内存中。数组位于名为“array”的标准库模块中
  • 好吧,您自己诊断了问题并提供了有效的解决方案,所以我不确定您的问题是什么。我要做的是只在内存列表/数组中存储数字。
  • @jsbueno 好吧,我想我会试试的。
  • @interjay 我的问题更像是:“我该怎么做?”...据我所知,我不能只在内存列表中存储数字,因为我从文件中读取了所有数据并且它们不会仅仅使用 int() 函数就变成整数。还是谢谢
  • @Bruno:我的意思是在读取文件后调用ord。

标签: python byte


【解决方案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。

【讨论】:

  • 我真的认为您的解决方案会奏效,但不幸的是,它没有奏效。现在我收到一个错误,如“TypeError:ord() 期望一个字符,但找到长度为 0 的字符串”。谢谢。
  • @BrunoO.c。 - 看我的编辑,我认为你读循环是空字符串的原因。
  • 谢谢,现在可以使用了。我正准备用另一种语言重写我的整个代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2014-01-31
  • 2020-11-04
  • 2013-03-01
  • 2016-07-09
  • 1970-01-01
相关资源
最近更新 更多