Java CRC算法实现与IBM16标准解析

版权申诉
0 下载量 189 浏览量 更新于2024-10-21 收藏 1KB RAR 举报
资源摘要信息:"Java中实现CRC算法,具体为IBM16 CRC算法" Java中的CRC(循环冗余校验)是一种检测数据传输或者存储错误的方法。CRC算法在数据通信和存储设备中广泛应用,因为其具有较高的检错率和较快的计算速度。它通过将数据视为一个长的二进制串,并用一个预定的生成多项式来计算出数据的一个“校验值”,也称为“CRC码”或“CRC校验和”。接收方可以使用相同的生成多项式来检验接收到的数据是否出现了错误。 CRC算法有很多种,其中IBM 16(CRC-16)就是其中的一种。它使用了16位的生成多项式来计算校验码。CRC-16具有较高的错误检测能力,但随着错误数量的增加,它不能保证检测出所有错误。CRC-16在串行通信和某些工业控制系统中非常常见。 在Java中实现CRC算法并不复杂,通常需要以下几个步骤: 1. 选择一个合适的生成多项式。对于IBM 16 CRC,一个常用的生成多项式是0xA001(即二进制的***)。 2. 初始化CRC寄存器。对于CRC-16,通常初始化为0xFFFF。 3. 对待发送或存储的数据进行处理。对于数据中的每一个字节,需要执行以下操作: a. 将数据中的一个字节与CRC寄存器的最低8位进行异或操作。 b. 将异或后的结果左移一位。 c. 如果最高位(第16位)是1,那么将生成多项式与这个结果进行异或操作。 d. 重复步骤b和c,直到左移了8次,处理了数据中的一个字节。 e. 将下一个字节取出,重复上述过程。 4. 完成所有字节的处理后,最终CRC寄存器中的值就是计算得到的CRC码。 5. 在数据传输或存储时,将CRC码附加在数据后面一起传输或存储。 6. 接收方收到数据后,使用同样的过程和生成多项式计算CRC码。如果计算出的CRC码与接收到的CRC码相符,则数据无误;如果不同,则数据在传输或存储过程中出现了错误。 文件名称列表中的"crc.java"文件可能包含了Java代码,用于实现上述的CRC-16算法。该文件还可能包含了CRC算法的测试代码,用来验证算法的正确性。 "HelloWorld.class"是Java源文件"HelloWorld.java"编译后的字节码文件,通常用于演示Java的运行机制,与CRC算法无直接关系。 "HelloWorld.java"文件中可能包含一个简单的Java程序,该程序在运行时输出"Hello, World!"。这个文件通常用来演示基本的Java语法和程序结构,并不涉及CRC算法内容。
2023-05-27 上传

//XW_crc_p.v `pragma protect begin module DW_crc_p( data_in, crc_in, crc_ok, crc_out ); parameter integer data_width = 16; parameter integer poly_size = 16; parameter integer crc_cfg = 7; parameter integer bit_order = 3; parameter integer poly_coef0 = 4129; parameter integer poly_coef1 = 0; parameter integer poly_coef2 = 0; parameter integer poly_coef3 = 0; input [data_width-1:0] data_in; input [poly_size-1:0] crc_in; output crc_ok; output [poly_size-1:0] crc_out; `define DW_max_data_crc_1 (data_width>poly_size?data_width:poly_size) wire [poly_size-1:0] crc_in_inv; wire [poly_size-1:0] crc_reg; wire [poly_size-1:0] crc_out_inv; wire [poly_size-1:0] crc_chk_crc_in; reg [poly_size-1:0] crc_inv_alt; reg [poly_size-1:0] crc_polynomial; `include "bit_order_crc_function.inc" `include "bit_order_data_function.inc" `include "calculate_crc_w_in_function.inc" `include "calculate_crc_function.inc" `include "calculate_crc_crc_function.inc" generate //begin genvar bit_idx; reg [63:0] crc_polynomial64; reg [15:0] coef0; reg [15:0] coef1; reg [15:0] coef2; reg [15:0] coef3; assign coef0= poly_coef0; assign coef0= poly_coef1; assign coef0= poly_coef2; assign coef0= poly_coef3; assign crc_polynomial64 = {coef3, coef2, coef1, coef0}; assign crc_pollynomial = crc_polynomial64[poly_size-1:0]; case(crc_cfg/2) 0: assign crc_inv_alt = {poly_size{1'b0}}; 1: for(bit_idx = 0; bit_idx<poly_sizel bit_idx=bit_idx+1) assign crc_inv_alt[bit_idx] = (bit_idx % 2)? 1'b0:1'b1; 2: for(bit_idx=0; bit_idx<poly_size; bit_idx=bit_idx+1) assign crc_inv_alt[bit_idx] = (bit_idx % 2)?1'b1:1'b0; 3: assign crc_inv_alt = { poly_size{1'b1}}; endcase endgenerate assign crc_in_inv = bit_order_crc(crc_in) ^ crc_inv_alt; assign crc_reg = calculate_crc(bit_order_data(data_in)); assign crc_out_inv = crc_reg; assign crc_out = bit_order_crc(crc_out_inv)^ crc_inv_alt; assign crc_chk_crc_in = calculate_crc_crc(crc_reg, crc_in_inv); assign crc_ok = (crc_chk_crc_in ==0); `undef DW_max_data_crc_1 endmodule `pragma protect end can you write a testbench for this piece of CRC verilog code so that this verilog file and the testbench can be used togerther by vcs to verify the correctness of this verilog file?

2023-06-14 上传

import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu import struct # 打开两个串口 com1 = serial.Serial(port='com2', baudrate=38400, bytesize=8, parity='N', stopbits=1) com2 = serial.Serial(port='com3', baudrate=38400, bytesize=8, parity='N', stopbits=1) # 创建Modbus RTU主机(master) master = modbus_rtu.RtuMaster(com1) master.set_timeout(1.0) master.set_verbose(True) # 读取保持寄存器数据 red = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9) print(red) # 将字节数组划分为若干个长度为4的子数组 # def hex_f(a,b): # # g1=b # # z=a+g1#高低16位组合 # # z1=hex(z)[2:]#取0x后边的部分 # # # print(z1) # # return struct.unpack('!f', z1.decode('hex'))[0]#返回浮点数 # # e = hex_f(red[0],red[1]) # # print(e) red1 = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9)[0] # 这里可以修改需要读取的功能码 print(red1) new = int(red1 * 0.8) print(new) red =master.execute(1, function_code=cst.WRITE_MULTIPLE_REGISTERS, starting_address=0, output_value=[new]) # 读取输入寄存器数据 input_regs = master.execute(1, cst.READ_INPUT_REGISTERS, 0, 9) print(input_regs,1) # 读取输入线圈数据 input_bits = master.execute(1, cst.READ_COILS, 0, 9) print(input_bits,2) # 读取输出线圈数据 output_bits = master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 9) print(output_bits,3) # 将所有读取数据打包为Modbus RTU消息并写入com2串口 data = red + input_regs + input_bits + output_bits com2.write(master._do_crc(data)) # 关闭串口 com1.close() com2.close()AttributeError: 'RtuMaster' object has no attribute '_do_crc'咋修改不报错

2023-05-27 上传
2023-05-27 上传