Как преобразовать из строки в 16-разрядное целое число без знака в Python? - PullRequest
1 голос
/ 04 октября 2019

В настоящее время я работаю над некоторым кодированием и декодированием строки в Python. Я должен был преобразовать некоторый код из C # в python, однако я столкнулся с некоторой проблемой, как показано ниже:

Так что теперь у меня есть строка, которая выглядит следующим образом: 21-20-89-00-67-00-45-78 Код должен был исключить -между числами и упакованы 2 целых числа в 1 группу, а затем преобразовать их в байты. В C # это было сделано следующим образом:

var value = "21-20-89-00-67-00-45-78";
var valueNoDash = value.Replace("-", null);
for (var i = 0; i < DataSizeInByte; i++)
{
    //convert every 2 digits into 1 byte
    Data[i] = Convert.ToByte(valueNoDash.Substring(i * 2, 2), 16);
}

Приведенный выше код представляет Шаг 1: Удалите - из строки, Шаг 2: используйте метод Substring, чтобы разделить их на 2 цифры в 1 группе, Шаг3: используйте Convert.ToByte с основанием 16, чтобы преобразовать их в 16-разрядное целое число без знака. Результат в Data равен

33
32
137
0
103
0
69
120

Пока что у меня нет проблем с этим кодом C #, однако, когда я пытаюсь сделать то же самое в Python, я не могу получить тот же результат, что и код C #,Мой код Python выглядит следующим образом:

from textwrap import wrap
import struct

values = "21-20-89-00-67-00-45-78"
values_no_dash = a.replace('-', '')
values_grouped = wrap(b, 2)
values_list = []

for value in values_grouped:
    values_list.append(struct.pack('i', int(value)))

В Python он дает мне список байтов в шестнадцатеричном значении, как показано ниже:

b'\x15\x00\x00\x00'
b'\x14\x00\x00\x00'
b'Y\x00\x00\x00'
b'\x00\x00\x00\x00'
b'C\x00\x00\x00'
b'\x00\x00\x00\x00'
b'-\x00\x00\x00'
b'N\x00\x00\x00'

Это объект в байтах, однакокогда я преобразовал этот объект в десятичную, он дает мне то же значение, что и исходная строка: 21, 20, 89, 0, 67, 0, 45, 78.

Что означает, что я не преобразовал успешно в 16-разрядное целое число без знака, верно? Как я могу сделать это в Python? Я пытался использовать str.encode(), но результат все еще другой. Как мне добиться того, что C # сделал в python?

Спасибо и признателен, если кто-нибудь может помочь!

1 Ответ

2 голосов
/ 04 октября 2019

Я думаю, что это решение, которое вы ищете:

values = "21-20-89-00-67-00-45-78"
values_no_dash_grouped = values.split('-') #deletes dashes and groups numbers simultaneously 
for value in values_no_dash_grouped:
    print(int(value, 16)) #converts number in base 16 to base 10 and prints it

Надеюсь, это поможет!

...