Mam plik, który czytam linie i manipulować strunami.

Oto przykładem kilku linii (plik jest format Hex Intel Jeśli jesteś zainteresowany):

:10DE50003EDE179280DB0338D2C32202023CD2D3CB
:10DE600022021792A0DB0338E2C32202023CE2D373
:10DE7000220292533EDEB0906400C4FF022082432F
:10DE80003EDE3741324190C3B8240013FDDBFF056D
:10DE900057494D453420D0D88CDEFDDB8FDEFF03A3

Zbudowany kumpel, utworzyłem tablicę z pierwszym 4: 7 bajtów jako indeks, np. DE50, a następnie użyj pozostałych 16 bajtów, ponieważ dane (00 po DE50 nie jest używany, a ostatni bajt nie jest używany). Powiedział, że mogę użyć Hexa i dodajmy, powiedzmy, 10 do DE50, aby uzyskać DE5A, a zatem zlokalizować bajt związany z tym indeksem. Problem polega na tym, że nie mogę tego zrozumieć. Czy jest to nawet możliwe? Pozwoliłoby to wówczas rozwiązać się dowolnym bajtem, którego chcę, znając indeks sześciokątny, który byłby naprawdę potężny.

Dziękuję Ci!

0
Thor Peterson 3 grudzień 2013, 08:35

2 odpowiedzi

Najlepsza odpowiedź

Jest Pakiet Intela Hex w Pypi Być może powinieneś na to spojrzeć

Oto kilka przykładów skopiowanych z dokumentów.

Po utworzeniu obiekt IntelHex można załadować za pomocą danych. Jest to konieczne tylko wtedy, gdy "źródło" było nieokreślone w konstruktorze. Możesz także załadować dane kilka razy (ale jeśli adresy w tych plikach pokrywają się, otrzymujesz wyjątku Adresoverlaperror). Ten błąd jest podnoszony tylko podczas odczytu z plików HEX. Podczas czytania z innych formatów, bez wyraźnego wywołania scalania, dane zostaną nadpisane. Na przykład.:

>>> from intelhex import IntelHex
>>> ih = IntelHex()                     # create empty object
>>> ih.loadhex('foo.hex')               # load from hex
>>> ih.loadfile('bar.hex',format='hex') # also load from hex
>>> ih.fromfile('bar.hex',format='hex') # also load from hex

Uwaga: Korzystanie z Intelhex.Fromfile jest polecany sposób.

Wszystkie powyższe przykłady odczyta z plików HEX. IntelHex obsługuje również czytanie prostych plików binarnych. Na przykład:

>>> from intelhex import IntelHex
>>> ih = IntelHex()                     # create empty object
>>> ih.loadbin('foo.bin')               # load from bin
>>> ih.fromfile('bar.bin',format='bin') # also load from bin
>>> ih.loadbin('baz.bin',offset=0x1000) # load binary data and place them
>>>                                     # starting with specified offset

Wreszcie dane można załadować z odpowiedniego słownika Pythona. Pozwoli to zapisać dane w obiekcie IntelHex do wbudowanego słownika i przywrócić obiekt w późniejszym czasie. Na przykład:

>>> from intelhex import IntelHex
>>> ih = IntelHex('foo.hex') # create empty object
>>> pydict = ih.todict()     # dump contents to pydict
...do something with the dictionary...

>>> newIH = IntelHex(pydict) # recreate object with dict
>>> another = IntelHex()     # make a blank instance
>>> another.fromdict(pydict) # now another is the same as newIH
2
John La Rooy 3 grudzień 2013, 05:00

Jesteś tutaj na właściwym miejscu, ale nie możesz mieć "tablicy" indeksowanej przez znaki sześciokątne. Tablice i listy są zawsze indeksowane liczbami całkowitymi, zaczynając od 0.


Jeśli znasz początkowe przesunięcie (które robisz, z pierwszej linii), możesz bardzo łatwo zrobić indeks. Na przykład wszystko, od 'DE50' do 'DE5F' powinno być line # 0, prawda? Tak więc, przekonwertuj, że DE50 do liczby całkowitej, podzielić o 16 (obcięcie frakcji) i odjąć 0xDE50. Lubię to:

with open('hexfile.txt') as f:
    lines = list(f)
offset = int(lines[0][4:7], 16) // 16

def get_line(hex_index):
    index = int(hex_index, 16) // 16
    return lines[index - offset]

Alternatywnie, ty może Używaj dict zniknął z indeksów sześciokątnych, zamiast {x1}}, a następnie zrób to, co zasugerował twój przyjaciel:

with open('hexfile.txt') as f:
    lines = {line[4:7]: line for line in f}

def get_line(hex_index):
    base_hex_index = hex_index[:3] + '0'
    return lines[base_hex_index]

Wydaje się jednak, że nie dodaje dodatkowej złożoności struktury danych bez żadnych korzyści. Jeśli masz kolejne linie, po prostu traktuj je sekwencyjnie. A jeśli masz liczby jako sznurki sześciokątne, wystarczy przekonwertować je na liczby, aby traktować je jako indeksy.

1
abarnert 3 grudzień 2013, 05:08