簡體   English   中英

在Python中逆無符號字符

[英]Inverse unsigned char in Python

我有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是一個無符號字符,在我的情況下是int,我可以使用ctypes或struct這樣的模塊,但是當我這樣做時:

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

它沒有給我我期望的結果。 LRC = 77 ,我雖然我應該得到LRC = '77' b'L' ,但是我得到b'L'所以它不會像C ++中的代碼那樣產生相同的結果。 如何正確轉換?

先感謝您!

C ++程序的PS輸出

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

您可以簡單地將AND與0xff強制將結果返回到無符號字符范圍內:

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

最簡單的方法是讓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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM