Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:
Предположим, что у вас есть класс с именем Student.
public class Student
{
private string FirstName;
private string LastName;
public string GetFullName()
{
return FirstName + LastName;
}
}
Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.
public class StudentInfo
{
public string GetStudentName()
{
Student s;
string fullname = s.GetFullName();
return fullname;
}
}
Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.
Предположим, что ваша шестнадцатеричная строка похожа на
>>> hex_string = "deadbeef"
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
>>> bytes.fromhex(hex_string) # Python ≥ 3
b'\xde\xad\xbe\xef'
>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')
Обратите внимание, что bytes
является неизменной версией bytearray
.
при условии, что я понял правильно, вы должны искать binascii.unhexlify
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
def hex2bin(s):
hex_table = ['0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011',
'1100', '1101', '1110', '1111']
bits = ''
for i in range(len(s)):
bits += hex_table[int(s[i], base=16)]
return bits
Предполагая, что у вас есть байтовая строка, например
"\ x12 \ x45 \ x00 \ xAB"
, и вы знаете количество байтов и их тип, вы также можете использовать это подход
import struct
bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)
#val = (18, 69, 43776)
Поскольку я указывал немного endian (используя символ '& lt;') в начале строки формата, функция возвращала десятичный эквивалент.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B равно одному байту (8 бит) без знака
H равно двум байтам (16 бит) unsigned
Более доступные символы и размеры байтов можно найти здесь
Преимущества:
Вы можете укажите более одного байта и endian значений
Недостатки ..
Вам действительно нужно знать тип и длину данных, которые вы имеете дело с
Хороший один лайнер:
byte_list = map(ord, hex_string)
Это будет перебирать каждый символ в строке и запускать его через функцию ord (). Проверено только на python 2.6, не слишком уверенно в 3.0 +.
-Josh
В bytearray есть встроенная функция, которая делает то, что вы намереваетесь.
bytearray.fromhex("de ad be ef 00")
Он возвращает bytearray и читает шестнадцатеричные строки с разделителем пространства или без него.
Вы должны иметь возможность построить строку, содержащую двоичные данные, используя что-то вроде:
data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
bits += chr(int(data[x:x+2], 16))
Это, вероятно, не самый быстрый способ (многие строковые приложения), но довольно простое использование только основного Python.
Для обратного преобразования используйте binascii.b2a_hex (obj)