正在尝试查找crc16 ibm的输入?

2024-09-27 07:26:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python为crc16编写代码,但没有得到正确的余数。我发送十六进制字符串作为输入 还可以尝试字节数组和二进制,但仍然无法获得正确的输出。输入应该是什么

import sys
import time
class CRC:

    def crc16ibm(msg1):
        #msg11=hex(msg1)
        msg11 = list(msg1)
        buflen = len(msg1)
        print("The message is ZZZ : ", msg1)
        #print("Hex value : " + hex(msg1))
        print("The length is QQQ : ", len(msg1))
        preset, offset, polynom =0, 0,0xA001

        preset = preset & 0xFFFF
        polynom = polynom & 0xFFFF
        buflen_i: int = buflen
        code_move = 0xFFFF
        crc = preset
        for i in range(buflen):
            #data = msg11[(i+offset)% buflen_i] & code_move
            data = (msg1[(i+offset)% buflen_i]) & code_move
            #print(type(data))
            crc ^= data

            for j in range(8):
                if((crc & 0x0001) !=0):
                    crc = (crc>>1)^polynom
                else:
                    crc = crc>>1
        return crc&0xFFFF


    # Test data for the crc to run
    print("First set of data : ")
    #msg1 = 0x000000000000003608010000016B40D8EA30010000000000000000000000000000000105021503010101425E0F01F10000601A014E0000000000000000010000C7CF
    #crc1 = 0x0000C7CF


    msg1 = 0x000000000000004A8E010000016B412CEE000100000000000000000000000000000000010005000100010100010011001D00010010015E2C880002000B000000003544C87A000E000000001DD7E06A00000100002994
    crc1 = 0x00002994
    #msg1 = 0x000000000000008c08010000013feb55ff74000f0ea850209a690000940000120000001e09010002000300040016014703f0001504c8000c0900730a00460b00501300464306d7440000b5000bb60007422e9f180000cd0386ce000107c700000000f10000601a46000001344800000bb84900000bb84a00000bb84c00000000024e0000000000000000cf00000000000000000100003fca
    #msg1 = 0xFFFF
    #crc1 = 0xFFFF

    print("The hex message is : " + hex(msg1))
    print("The length of hex msg is :", len(hex(msg1)))
    print("The CRC is ", hex(crc1))
    print(" and lenght is ", len(hex(crc1)))

    zero, m1, kind =0, len(hex(msg1)), 'b'
    msg_a = f'{msg1:{zero}>{m1}{kind}}'
    #print(type(msg_a))

    msgInBin =bin(int(msg_a, 16)).zfill(8)
    crcchecksum = crc16ibm(msgInBin)

    print(" the msg_a is PPP : ", msg_a)
    print(" The lenght of EEE: ", len(msg_a))
    if (crcchecksum == crc1):
        print("Checksum is saying the whole package is received")
    else:
        print("The ", hex(crc1), " is not matching is ",  hex(crcchecksum))

Tags: thedatalenismsgoffsetcrcpreset
1条回答
网友
1楼 · 发布于 2024-09-27 07:26:49
  1. 输入通常是字节,您的示例建议将其从十六进制转换为字节
  2. 将十六进制输入写成一个大整数并不是您想要做的事情。例如,这会丢弃所有显示为消息一部分的前导零。然后使用list()从中获取字节的尝试无效。您需要的是一个十六进制输入的字符串,并使用bytearray.fromhex()将其转换为字节
  3. 你的例子末尾有CRC。似乎需要根据CRC之前的字节计算CRC,不包括CRC。然后将其与CRC进行比较。(这些CRC字节没有按照正确的顺序追加,以便能够计算整个消息的CRC,并期望得到零。)

你的例子来自哪里?你能链接到源代码吗

下面是一个CRC参数示例(称为CRC-16/ARC)msg应该是bytearray:

def crc16arc(msg):
    crc = 0
    for b in msg:
        crc ^= b
        for _ in range(8):
            crc = (crc >> 1) ^ 0xa001 if crc & 1 else crc >> 1
    return crc

print(hex(crc16arc(b'123456789')))
print(hex(crc16arc(bytearray.fromhex("313233343536373839"))))
print(hex(crc16arc(bytearray.fromhex("3132333435363738393dbb"))))

相关问题 更多 >

    热门问题