2015-07-03 3 views
2

У меня есть файл, который представляет собой некоторый ясный текст шестнадцатеричных байтов (кроме первых 18 байтов), но кодировка файла - UTF-16. Вот короткий дамп файла:Декодирование строк кодированных символов UTF-16.

00000000 ff fe 35 1f d3 bb 7a ef df 45 92 df be ff 33 c2 |..5...z..E....3.| 
00000010 af c7 30 00 42 00 45 00 33 00 45 00 35 00 45 00 |..0.B.E.3.E.5.E.| 
00000020 35 00 44 00 35 00 44 00 41 00 36 00 44 00 38 00 |5.D.5.D.A.6.D.8.| 
00000030 42 00 41 00 30 00 37 00 39 00 42 00 46 00 34 00 |B.A.0.7.9.B.F.4.| 
00000040 46 00 31 00 45 00 41 00 36 00 37 00 32 00 34 00 |F.1.E.A.6.7.2.4.| 
00000050 42 00 39 00 43 00 42 00 41 00 42 00 45 00 44 00 |B.9.C.B.A.B.E.D.| 
... 

Я хотел бы прочитать этот файл построчно (он имеет \r\n разрывы строк) и получить данные шестигранные из строки. Если это строка ASCII я мог бы просто сделать это:

a_line = '00112233445566778899' 
hex_data = a_line.decode('hex') 

Но поскольку это UTF-16, я получаю сообщение об ошибке при попытке Non-hexadecimal digit этого подхода.

Мой вопрос: Как я могу загрузить строку кодированных шестнадцатеричных символов UTF-16 в виде шестнадцатеричных данных?

ответ

1
00000000 ff fe 35 1f d3 bb 7a ef df 45 92 df be ff 33 c2 |..5...z..E....3.| 
00000010 af c7 30 00 42 00 45 00 33 00 45 00 35 00 45 00 |..0.B.E.3.E.5.E.| 

Первая строка содержит не шестнадцатеричные символы 35 1f d3 bb 7a ef ... af c7. Поэтому будьте осторожны при декодировании - это не чистый Hex.

Вы можете прочитать этот файл, используя модуль io, где вы можете явно объявить файл кодирование:

def main(args): 
    with io.open(testfile, "r", encoding = 'utf-16') as inf: 
     lines = inf.readlines() 

    for line in lines: 
     print(line) 

    return 0 

Newlines должен быть обнаружен автоматически, но вы можете явно определить их в io.open с дополнительным параметром (, newline = "\r\n")

Как только вы прочитали, вы должны быть в состоянии .decode нормально.

Смежные вопросы