簡體   English   中英

Python bytearray()索引分配

[英]Python bytearray() index assignment

在這里忍受我 我是系統管理員,不是開發人員。 以下代碼對我來說很好用。 但是,當我將其拆分為兩個文件,以使該類位於一個文件中,而邏輯位於另一個文件中時,出現錯誤,表明data [0]是str且不支持賦值

精簡工作示例

class partition:
    def __init__(self):
        self.data = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
        return

    def boot_flag(self, value=None):
        if value is not None:
            self.data[0] = value
            return
        else:
            return self.data[0:1][::-1]


part1 = partition()
print str(part1.data).encode('hex')
value = b"\xff"
part1.boot_flag(value)
print str(part1.data).encode('hex')

這是目前的完整課程。

class partition:
    def __init__(self):
        self.data = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")

    def boot_flag(self, value=None):
        if value is not None:
            self.data[0] = value
            return
        else:
            return self.data[0:1][::-1]

    def start_chs(self, value=None):
        if value is not None:
            self.data[1:4] = value
            return
        else:
            return self.data[1:4][::-1]

    def type(self, value=None):
        if value is not None:
            self.data[4:5] = value
            return
        else:
            return self.data[4:5][::-1]

    def end_chs(self, value=None):
        if value is not None:
            self.data[5:8] = value
        else:
            return self.data[5:8][::-1]

    def start_lba(self, value=None):
        if value is not None:
            self.data[8:12] = value
        else:
            return self.data[8:12][::-1]

    def sectors(self, value=None):
        if value is not None:
            self.data[12:16] = value
        else:
            return self.data[12:16][::-1]

    def load(self, data):
        self.data = data
        return

這是我用來測試課程的測試夾具。

import dospart
disk = open('/dev/sda', 'rb')
mbr = disk.read(512)
part1 = dospart.partition()
part1.load(mbr[446:462])
print str(part1.data).encode('hex')
part1.boot_flag(b"\xff")
print str(part1.data).encode('hex')

這是錯誤

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    part1.boot_flag(b"\xff")
  File "/Users/digitaladdictions/PycharmProjects/dospart/dospart.py", line 9, in boot_flag
    self.data[0] = value
TypeError: 'str' object does not support item assignment

請注意,我可以讀取這些值。 當我嘗試寫入self.data []時,我只會收到錯誤消息

[UPDATE]

根據公認的答案,這是我的新加載功能。

def load(self, data):
    part = bytearray(data)
    self.data = part
    return

我認為這是正在發生的事情。 調用時:

part1.load(mbr[446:462])

self.data被分配了一個字符串。 至此, self.data是一個字符串,而不是一個字節數組。 所以當你這樣做

part1.boot_flag(b"\xff")

它正確地抱怨TypeError: 'str' object does not support item assignment

這就是我的意思:

>>> data_one = "My name is shaktimaan"
>>> data_two = data_one[5:10]
>>> type(data_one)
<type 'str'>

在第一種情況下,沒有調用load ,因此self.data仍然是字節數組(在調用構造函數之后)。 因此,您的boot_flag可以正常工作而不會抱怨。

我認為您需要修復load的代碼以將字節數組分配給self.data

您不能就地更改Python字符串,這是不可變的。 您可以找到很多有關該錯誤的注釋:“'str'對象不支持項目分配器”。 如果將其合並到一個文件中,我不知道它如何工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM