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 是一个将字符的 ASCII 代码转换为十六进制的函数。 我必须用 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 或结构体,但是当我这样做时:
import ctypes
import struct
cchar1=(struct.pack('1B',LRC))
cchar2= ctypes.c_char(LRC)
它没有给我我期待的结果。LRC = 77
,我虽然我应该得到LRC = '77'
,但我得到b'L'
所以它不会给出与C++中的代码相同的结果。 如何以正确的方式转换它?
提前谢谢你!
附言 C++程序输出
char *p={":010600000045"};
cout<<LRC_form(p);
正在给予76
我正在尝试与Python 3相同
编辑 1
return LRC;
在C程序中给出76
. 这与我可以在我的 Python 代码中获得的相同。 但
return ((~(LRC))+1);
给了180
,我不知道我应该怎么做才能在 Python 中获得相同的内容。
编辑 2
ASCII2十六进制函数:
unsigned char ASCII2hex (char ASCII)
{
if (ASCII<0x40)
return (ASCII-0x30);
else
return (ASCII-0x37);
}
enter code here
最简单的方法是让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)
您可以简单地使用 AND 0xff将结果强制回无符号字符范围:
return ((~LRC)+1) & 0xff
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中