Python中的反无符号字符

时间:2017-08-05 12:38:35

标签: python c++ unsigned-char

我有C ++中的代码:

unsigned char LRC_form(char* cadr)
{
  unsigned char LRC=0;
  unsigned int t=0;
  LRC=0;
  for (t=1;t<0x0D;t=t+2)
  {
    LRC=LRC+ASCII2hex(cadr[t])*16+ASCII2hex(cadr[t+1]);
  }
  return ((~(LRC))+1);
}
int main(int argc, char *argv[])
{
    char *p={":010600000045"};
    cout<<LRC_form(p);
}

其中ASCII2Hex是将char的ASCII代码转换为HEX的函数。 我必须在Python中编写相同的内容,所以我这样做:

def LRC_FORM():
    LRC=0
    string_to_send = "010600000045"
    Arr = list(string_to_send)
    #LRC = int(Arr[1])+2
    #print(LRC)
    counter=0
    for i in string_to_send:
        numb = int(i, 16)
        if counter%2 == 0:
            LRC = LRC + numb * 16
        else:
            LRC = LRC + numb
        counter = counter + 1

但是我应该如何实现(~LRC)+ 1,因为LRC是一个unsigned char,在我的例子中它是int,我可以使用像ctypes或struct这样的模块,但是当我这样做时:

import ctypes
import struct
cchar1=(struct.pack('1B',LRC)) 
cchar2= ctypes.c_char(LRC) 

它没有给我我期待的结果。 LRC = 77,虽然我应该LRC = '77',但我得b'L'所以它不会像C ++中的代码一样给出相同的结果。 我怎样才能以正确的方式转换它?

提前谢谢!

P.S。 C ++程序的输出

char *p={":010600000045"};
cout<<LRC_form(p);

正在提供76 我想尝试使用Python 3

编辑1

return LRC; 
C程序中的

给出了76。 我的Python代码也是如此。 但是

return ((~(LRC))+1);

给出了180,我不知道我该怎么做才能在Python中使用它。

编辑2

ASCII2Hex功能:

unsigned char ASCII2hex (char ASCII)
{
  if (ASCII<0x40)
    return (ASCII-0x30);
  else
    return (ASCII-0x37);
}
    enter code here

2 个答案:

答案 0 :(得分:2)

您可以简单地使用0xff与强制结果重新进入unsigned char范围:

return ((~LRC)+1) & 0xff

答案 1 :(得分:2)

这样做的简单方法是让binascii.unhexlify完成大部分工作。我们只需要发送一个bytes字符串,而不是文本字符串。

import binascii

def lrc(s):
    # Convert string s to bytes
    b = s.encode('ascii')

    # Interpret hex data in b
    h = binascii.unhexlify(b)

    # Add the byte values
    return sum(h)

# test

s = "010600000045"
print(lrc(s))

<强>输出

76

我们可以使该功能更紧凑,但结果不太可读:

def lrc(s):
    return sum(binascii.unhexlify(s.encode('ascii')))

我们可以轻松地在Python中((~(LRC))+1),但我们必须小心,原因有二。首先,Python没有无符号整数,其次,Python的整数具有无限精度。但我们可以通过提供合适的面具来处理这两件事。如果我们想将结果限制为8位,我们可以使用0xff == 255的掩码:

l = 76
print(l, (0xff & ~l) + 1)

<强>输出

76 180

或者我们可以在反转位之后但在进行屏蔽之前进行添加:

0xff & (~l + 1)