首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的逆无符号字符

Python中的逆无符号字符
EN

Stack Overflow用户
提问于 2017-08-05 12:38:35
回答 2查看 1.6K关注 0票数 1

我有C++中的代码:

代码语言:javascript
复制
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是将字符的ASCII代码转换为HEX的函数。我必须用Python编写同样的代码,所以我这样做:

代码语言:javascript
复制
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是一个无符号字符,在我的例子中它是int,我可以使用一些模块,比如ctype或struct,但是当我这样做时:

代码语言:javascript
复制
import ctypes
import struct
cchar1=(struct.pack('1B',LRC)) 
cchar2= ctypes.c_char(LRC) 

这并没有给我预期的结果。LRC = 77,我想我应该得到LRC = '77',但是我得到的是b'L',所以它不会给出与C++中的代码相同的结果。我怎么才能把它转换成正确的方式呢?

提前谢谢你!

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

代码语言:javascript
复制
char *p={":010600000045"};
cout<<LRC_form(p);

76的是我尝试用Python3得到同样的东西

编辑1

代码语言:javascript
复制
return LRC; 

在C语言中给出了76。这和我在Python代码中得到的一样。但

代码语言:javascript
复制
return ((~(LRC))+1);

给出了180,而我不知道我应该怎么做才能在Python中得到同样的结果。

编辑2

ASCII2Hex函数:

代码语言:javascript
复制
unsigned char ASCII2hex (char ASCII)
{
  if (ASCII<0x40)
    return (ASCII-0x30);
  else
    return (ASCII-0x37);
}
    enter code here
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-05 13:28:31

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

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
76

我们可以使该功能更加紧凑,尽管结果的可读性较低:

代码语言:javascript
复制
def lrc(s):
    return sum(binascii.unhexlify(s.encode('ascii')))

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

代码语言:javascript
复制
l = 76
print(l, (0xff & ~l) + 1)

输出

代码语言:javascript
复制
76 180

或者,我们可以在倒置比特后进行加法,但在进行掩蔽之前:

代码语言:javascript
复制
0xff & (~l + 1)
票数 3
EN

Stack Overflow用户

发布于 2017-08-05 13:21:45

您可以简单地使用0 0xff将结果强制返回到未签名的char范围:

代码语言:javascript
复制
return ((~LRC)+1) & 0xff
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45521996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档