Python cashcode 驱动程序的 CRC(从 JS 到 Python)
Python CRC for cashcode driver (From JS to Python)
我尝试为 CashCode 重写 CCNET 驱动程序,从节点到 Python。
但是,我真的不能 运行 CRC 生成器。
您可以在 Github repo
上找到 "working" 代码
这里是JS函数:
function getCRC16(bufData) {
var POLYNOMIAL = 0x08408;
var sizeData = bufData.length;
var CRC, i, j;
CRC = 0;
for (i = 0; i < sizeData; i++) {
CRC ^= bufData[i];
for (j = 0; j < 8; j++) {
if (CRC & 0x0001) {
CRC >>= 1;
CRC ^= POLYNOMIAL;
} else CRC >>= 1;
}
}
var buf = new Buffer(2);
buf.writeUInt16BE(CRC, 0);
CRC = buf;
return Array.prototype.reverse.call(CRC);
}
我尝试 crcmod
,但它不是预定义函数,当我尝试设置多项式时,出现错误
这是我以前的工作代码:
@staticmethod
def getCRC16(data):
CRC = 0
for i in range(0, len(data), 2):
CRC ^= int(str(data[i:(i+2)]), 16)
for j in range(8):
if (CRC & 0x0001):
CRC >>= 1
CRC ^= 0x8408
else:
CRC >>= 1
CRC = format(CRC, '02x')
return CRC[2:4] + CRC[0:2]
然后我得到
CRC ^= int(str(data[i:(i+2)]), 16)
ValueError: invalid literal for int() with base 16: '\x02\x03'
帮助我实现该功能。 (输入 binary/integers 或十六进制字符串)
UPD: :它适用于 bytearray.fromhex(data)
。谢谢)
@staticmethod
def getCRC16(data):
data = bytearray.fromhex(data)
CRC = 0
for bit in data:
CRC ^= bit
for j in range(0, 8):
if (CRC & 0x0001):
CRC >>= 1
CRC ^= 0x8408
else:
CRC >>= 1
CRC = format(CRC, '02x')
return CRC[2:4] + CRC[0:2]
你需要
my_int = struct.unpack("h",data[i:i+2])
# my_int = 770 ?
你还需要用 0xFFFF 来截断结果(我认为)(因为 python 整数将永远上升)
自 Python 2.6: bytearray.fromhex(data)
.
for byte in bytearray.fromhex(data):
CRC ^= byte
...
我尝试为 CashCode 重写 CCNET 驱动程序,从节点到 Python。 但是,我真的不能 运行 CRC 生成器。
您可以在 Github repo
上找到 "working" 代码这里是JS函数:
function getCRC16(bufData) {
var POLYNOMIAL = 0x08408;
var sizeData = bufData.length;
var CRC, i, j;
CRC = 0;
for (i = 0; i < sizeData; i++) {
CRC ^= bufData[i];
for (j = 0; j < 8; j++) {
if (CRC & 0x0001) {
CRC >>= 1;
CRC ^= POLYNOMIAL;
} else CRC >>= 1;
}
}
var buf = new Buffer(2);
buf.writeUInt16BE(CRC, 0);
CRC = buf;
return Array.prototype.reverse.call(CRC);
}
我尝试 crcmod
,但它不是预定义函数,当我尝试设置多项式时,出现错误
这是我以前的工作代码:
@staticmethod
def getCRC16(data):
CRC = 0
for i in range(0, len(data), 2):
CRC ^= int(str(data[i:(i+2)]), 16)
for j in range(8):
if (CRC & 0x0001):
CRC >>= 1
CRC ^= 0x8408
else:
CRC >>= 1
CRC = format(CRC, '02x')
return CRC[2:4] + CRC[0:2]
然后我得到
CRC ^= int(str(data[i:(i+2)]), 16)
ValueError: invalid literal for int() with base 16: '\x02\x03'
帮助我实现该功能。 (输入 binary/integers 或十六进制字符串)
UPD: :它适用于 bytearray.fromhex(data)
。谢谢)
@staticmethod
def getCRC16(data):
data = bytearray.fromhex(data)
CRC = 0
for bit in data:
CRC ^= bit
for j in range(0, 8):
if (CRC & 0x0001):
CRC >>= 1
CRC ^= 0x8408
else:
CRC >>= 1
CRC = format(CRC, '02x')
return CRC[2:4] + CRC[0:2]
你需要
my_int = struct.unpack("h",data[i:i+2])
# my_int = 770 ?
你还需要用 0xFFFF 来截断结果(我认为)(因为 python 整数将永远上升)
自 Python 2.6: bytearray.fromhex(data)
.
for byte in bytearray.fromhex(data):
CRC ^= byte
...