2015-03-17 3 views
0

, поэтому я работаю над назначением кодирования/декодирования для перехода на передний план для разработки программного обеспечения и при использовании встроенной функции ord() с Python 3.3 кажется, что оно возвращает неправильное значение на определенный момент в моем коде.python ord не работает как ожидалось

Когда мы хотим кодировать номер кодировки от 1-120, мы просто добавляем этот кодовый номер в 128. Для чисел от 121 до 375 мы используем два байта, первый из которых является F9, означающим, что следующий один байт является частью номер кода, а второй - фактический номер кода (закодированный кодом № - 128). Так, например, 121 будет F9 00.

При декодировании я столкнулся с проблемой, когда после чтения в F9 и перехода в код для декодирования второго байта я столкнулся с проблемой с функцией ord.

Мой код:

def decode_num(base_num, input_file): 
    if base_num <=248: 
    #coding for if the code is simply a one byte code from 1-120(will have been coded as 248) 
     return base_num-128 
    elif base_num == 249: 
    #coding for if the code is a two byte code, thus the first byte of the code will be 121 
     second_byte=ord(input_file.read(1)) 
     return second_byte+121 

Это, кажется, работает хорошо, пока он не достигнет кодирования для 134, который должен быть F9 0D. Вызов ord (input_file.read (1)) возвращает 10 вместо 13, как и следовало ожидать. Я подтвердил, что в файле mtf, который я пытаюсь декодировать, hexdump показывает F9 0D, где я сталкиваюсь с проблемой. С текущим тестовым случаем я работаю через него только с 0D в качестве второго байта двух байтового кода. 0C и обратно работают нормально, а 0E и впереди все работают нормально.

Любые идеи в отношении того, что может быть причиной этого? Или альтернативные идеи для декодирования двух байтового кода?

Редактировать: Я забыл упомянуть, что файлы mtf будут закодированы в латинском-1. Если это имеет значение.

+0

Вы используете Windows? – jedwards

+0

Написание кода на окнах, но фактически его запуск на CentOS 7 (это то, что установлено на лабораторных компьютерах, с которыми я дистанционно подключаюсь). Я забыл добавить, что файлы mtf закодированы в латинском-1, я обновлю вопрос. –

+0

Были созданы файлы, которые вы пытаетесь прочитать, были ли они созданы в Windows или CentOS? – jedwards

ответ

0

Я выяснил причину моей проблемы. Это связано с Python и тем, как он имеет дело с различными стилями кодирования. Он видит «\ r» как новую строку, поэтому он обрабатывает «\ r» и «\ n» одинаково. Таким образом, когда я пытаюсь декодировать 0x0d, он дает мне тот же результат, что и для 0x0a.

Мне удалось решить проблему, указав новую строку как «» в открытии входного файла.

input_file = open(input_name, encoding="latin-1", mode="r", newline="") 

Спасибо за помощь в решении проблемы. Это была единственная проблема, мой код действует как ожидалось сейчас.

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