解析此字节的更短方法

时间:2017-08-17 10:08:47

标签: python parsing bit-manipulation byte

在python中有更短的方法吗?

        if byte is 1:
            return 0
        if byte is 2:
            return 1
        if byte is 4:
            return 2
        if byte is 8:
            return 3
        if byte is 64:
            return 4
        if byte is 128:
            return 5

我正在使用python2.7

创建字典是可能的,但仍然很长,有数学方法吗? 感谢。

4 个答案:

答案 0 :(得分:3)

创建一个dictionary,每个键值对包含一个可能的值byte作为键,相应的结果作为值。

result = {
  1: 0,
  2: 1,
  4: 2,
  8: 3,
  64: 4,
  128: 5
}[byte]

请注意,如果byte的值不在字典中,则此解决方案将抛出异常。您只需稍微修改它以检查不同的值:

result = {
  1: 0,
  2: 1,
  4: 2,
  8: 3,
  64: 4,
  128: 5
}.get(byte, -1)

如果byte不是其中一个键,则结果为-1。

答案 1 :(得分:2)

可能使用字典吗?

options = {
  1: 0,
  2: 1,
  4: 2,
  8: 3,
  64: 4,
  128: 5
}
def get_value(x):
    return options.get(x, default_val)

答案 2 :(得分:1)

byte_dict = {'1':0, '2':1, '4':2, '8':3, '64':4, '128':5}
return byte_dict[str(byte)]

答案 3 :(得分:1)

详细

如果您坚持使用非字典解决方案,则可以使用对数基数2和一些布尔运算,如下所示。

首先从输入字节b获取对数基数2(在某些语言中表示为lg(b),但我不知道Pythonian;并注意log:在大多数语言中,这表示对数基数10)。

如果您的语言中没有此类函数,请使用自然对数进行转换,如下所示:n=ln(b)/ln(2)。对于b,您获得以下n

b   n

1   0
2   1
4   2
8   3
64  6
128 7

在此中间结果n上,应用一些布尔运算:

n       a=     b=   c=    r=
=  bin  nAND4  a>>1 bXOR7 nANDc dec
0  000  000    000  111   000   0
1  001  000    000  111   001   1
2  010  000    000  111   010   2
3  011  000    000  111   011   3
6  110  100    010  101   100   4
7  111  100    010  101   101   5

您需要将其翻译成Pythonian。假设有一个对数基数2(否则如上所示进行转换),这里用lg(b)表示,其中b是你的输入字节,那么总而言之,你有这个

结果

r = ((((lg(b)) And 4 ) >> 1) Xor 7) And lg(b)