#python #for-loop #hex
Вопрос:
У меня есть шестнадцатеричный код сортировки, представленный как переменная «id_type». Я хочу разделить его на три столбца, и длина 3-го столбца зависит от декодированного значения 2-го столбца. Вот пример результата, который я хочу.
0001 0005 0701f83fe4
0002 0005 0000921912
0002 0005 0000921912
0004 0004 00a1d033
0005 0004 00252e28
0010 0002 0117
Вот мой код
id_type = "000100050701f83fe40002000500009219120003000400014cc80004000400a1d0330005000400252e280010000201170012000e484c543530305f56333034373042001300143839363630333230323030303237383737363446001400011f0015000e01030200030004000501060007000016000202cb300900249906000232339907000131990800073030303839363399090005323033303090110001013010000601000201060130120004000000003013000900016200ec0040010030140005fdffff5f0b30150002000d3016000200213017000104301800020004301900020061301a0008017d0196012801d4901000010160c00002038860d000012862f000020000605000017f64900001006010000100500100010050020001015003000100500400010050050002000050060002155450070002155450080001005009000100500a000100500b000100500c000100500d000146500e000400000000500f00010050100004000000005011000400000000501200040000000050130004000000005014000400000000501500040000000050160004000007d45017000200295019000400000000501a0006020000000000501b000100501c0002003c501d0006000000000000a0e7"
def hex_to_dex(id_type):
return int(id_type, 16)
n = 4
for i in id_type:
i = 0
id = id_type[i:i n]
lendata = id_type[i n:i n n]
lendatah2d = hex_to_dex(lendata)
data = id_type[i n n:i n n lendatah2d * 2]
p = len(id lendata data)
print(id, lendata, data)
Но когда мой код запускается, он выводит только 1 строку нужного мне результата.
0001 0005 0701f83fe4
Как я могу отредактировать свой код?
Пожалуйста, помогите мне.
Комментарии:
1. сделайте отступ
2. Одна из проблем заключается в том, что целевая переменная цикла
i
перезаписывается самой первой строкой внутри цикла.3. Другая проблема заключается в том, что зацикливание строки на отдельных символах, вероятно, не лучший способ подойти к этому.
Ответ №1:
Прежде всего, print
он должен быть внутри цикла, чтобы печатать каждую итерацию, а не последнюю
for i in id_type:
i = 0
...
print(id, lendata, data)
Затем
i
не следует генерировать какой-либо цикл, так как он не увеличивается на фиксированную величину (зависит от длины данных).- увеличивайте
i
каждый раз, когда вы читаете данные
id_type = "000100050701f83fe40002000500009219120003000400014cc80004000400a1d033"
"0005000400252e280010000201170012000e484c543530305f563330343730420013"
"00143839363630333230323030303237383737363446001400011f0015000e010302"
"00030004000501060007000016000202cb3009002499060002323399070001319908"
def hex_to_dex(id_type):
return int(id_type, 16)
n = 4
i = 0
while i < len(id_type) - 8:
key = id_type[i:i n]
i = n
lendata = id_type[i:i n]
lendatah2d = hex_to_dex(lendata)
i = n
data = id_type[i:i lendatah2d * 2]
i = lendatah2d * 2
print(key, lendata, data)
Ответ №2:
Чтобы избежать головной боли с увеличивающимся индексом, вы можете эмулировать чтение из файла с помощью io.StringIO
класса.
import io
id_type = ('000100050701f83fe4'
'000200050000921912'
'0003000400014cc8'
'0004000400a1d033')
stream = io.StringIO(id_type)
while True:
row_id = stream.read(4)
if not row_id:
# end of "file" reached
break
row_len = stream.read(4)
row_data = stream.read(2 * int(row_len, 16))
print(row_id, row_len, row_data)