Java简易CRC计算器的实现与应用

版权申诉
0 下载量 67 浏览量 更新于2024-10-07 收藏 2KB RAR 举报
资源摘要信息:"本文档包含一个用Java编写的简单计算循环冗余校验(CRC)的小程序。CRC是数据传输或存储中用于检测数据错误的一种校验码。虽然该程序是作者自行编写的,并且相对简陋,但它能完成基本的CRC计算功能。" 在深入知识点之前,我们先来了解一下CRC(循环冗余校验)的基本概念以及它在数据传输和存储中的重要性。 循环冗余校验(CRC)是一种根据网络数据包或电脑文件等数据块产生固定位数校验码的一种散列函数,主要用来检测或校验数据传输或保存后可能出现的错误。它是通过将数据视为一个长的二进制数,对该数进行除法运算,并将余数作为校验码附加到数据的末尾。当数据被发送或存储时,接收方或读取方可以再次进行同样的计算,将计算出的校验码与原校验码进行比对,若一致则表示数据未出现错误。 在文件标题中提到的"crc.rar_java crc"暗示了以下知识点: 1. Java编程语言:Java是一种广泛使用的高级编程语言,它具有跨平台的特性,即“一次编写,到处运行”的能力。Java代码被编译成字节码,可以在任何安装了Java虚拟机(JVM)的设备上运行。文件中的Java程序是一个用于计算CRC的工具。 2. CRC计算实现:虽然文件描述提到该Java程序是简陋的,但基本功能是实现CRC计算。在实现上,可能涉及到二进制运算、位操作和算法逻辑。CRC算法有多种变体,比如CRC32、CRC16等,具体使用哪种取决于应用场景。 3. 文件压缩与解压缩:标题中的"rar"表明这个Java程序可能被打包在一个RAR压缩文件中。RAR是一种压缩文件格式,通常需要专门的软件来创建和打开。在RAR文件中仅有"crc"一个文件名,暗示了这个压缩文件可能只包含一个与CRC计算相关的Java文件,但不排除还有其他的资源文件或文档说明。 从【压缩包子文件的文件名称列表】中,我们可以得知RAR文件中仅有一个文件,即为"crc"。这个文件很可能是Java源代码文件(假设其扩展名为.java),或者是编译后的.class字节码文件,也有可能是打包成jar包的形式。在RAR文件中通常会包含编译后的二进制代码或可执行的jar包,但也不排除包含源代码的可能性,尤其是对于简单的工具程序。 在标签"java_crc"中,我们可以总结出以下知识点: 4. Java CRC实现的应用:该Java程序很可能是用于学习、测试或者其他简单的应用场景。标签"java_crc"指出了程序的功能和使用场景,同时表明这方面的知识在Java开发者中是常见且实用的。 总结来说,这个Java程序虽然简单,但它涵盖了Java编程基础、文件压缩技术、以及CRC校验算法的应用等多个知识点。对CRC算法的实现可以加深对数据校验和错误检测原理的理解,而对Java编程的学习和实践则是IT行业专业人员的一项基本技能。同时,文件压缩与解压缩的相关知识在日常的软件开发和使用过程中也是不可或缺的。
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 上传