所以我正在为一个软件工程课程进行一个Move to Front Encoding / Decoding赋值,当在Python 3.3中使用内置的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文件已经用latin-1编码了。如果这有所不同。
答案 0 :(得分:0)
我找到了问题的原因。这是由于Python以及它如何处理不同的编码风格。它将'\ r'视为新行,因此它以同样的方式处理'\ r'和'\ n'。因此,当我尝试解码0x0d时,它给出了与0x0a相同的结果。
我能够通过在打开输入文件时将换行符指定为“”来解决此问题。
input_file = open(input_name, encoding="latin-1", mode="r", newline="")
感谢您对该问题的帮助。这是唯一的问题,我的代码现在按预期行事。