2012-02-01 28 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