本帖最后由 z332406259 于 2016-4-12 00:24 编辑
package com.heima.lzm33;
import java.util.zip.CRC32;
public class Test_4 {
/**
* 第二题:2、现在有如下通信协议,请实现相关函数模块。
* 此协议是一个二进制协议,每个协议报文由如下数据流构成,数值都以Big-endian大端方式存储:
* { TotalSize[2],Crc32[4], Ver[1], Cmd[1], Data[len] } 方括号中是占用的字节数。具体解释:
* TotalSize:2字节,表示整个报文的长度,这个值应该等于: 2 + 4 + 1 + 1 + len
* Crc32: 4字节,表示对 {Ver, Cmd,Data} 内容的 crc32 的校验值
* Ver: 1字节,协议版本,目前约定为 0x05
* Cmd: 1字节,用户指定的操作命令,0x00 ~0xff
* Data: len个字节,具体的数据内容
* 要求:实现一个函数 pack(cmd, data, len) 输入:cmd:
* 用户指定的操作命令; data: 用户指定的数据; len: 数据长度 输出:打包好的协议报文
*/
public static void main(String[] args) {
pack(0x0A, "35566",5 );
//报文打包方法(这边也可以不自己输入数值,设置键盘录入)
}
public static void pack(int cmd, String data, int len) {//方法:参数:int String int(用键盘录入可以全定义为String,然后转换)
CRC32 crc32 = new CRC32(); //建立CRC32对象
short TotalSize = (short) (2 + 4 + 1 + 1 + len);//定义变量TotalSize
byte Ver = 0x05; //定义Ver
byte Cmd = (byte) cmd; //定义Cmd
byte[] Data = new byte[len]; //建立字节数组来接收数据,因为数据是一个一个接收的.
Data = data.getBytes(); //将字符串转换为字节数组
byte[] b = new byte[len + 2]; //新建一个比数据长度+2的字节数组
for (int i = 0; i < Data.length - 1; i++) { //遍历该数组将数据数组放入新数组中
b = Data;
}
b[len - 1] = Ver; //将Ver和Cmd也放入新数组中
b[len - 2] = Cmd;
crc32.update(b); //调用CRC32的方法传入字节数组更新校检值
int Crc32 = (int) crc32.getValue(); //取出校检值赋给Crc32
System.out.print("{" + Integer.toHexString(TotalSize) + ","+ Integer.toHexString(Crc32) + ","
+ Integer.toHexString(Ver)+ "," + Integer.toHexString(Cmd) + ",");
//输出{ TotalSize[2],Crc32[4], Ver[1], Cmd[1], Data[len] } 的十六进制表示
//因为Big-endian大端方式是低地址存储最高有效字节,和正常习惯一样,直接打印十六进制.
for (byte c : Data) {
System.out.print(Integer.toHexString(c));
}
System.out.println("}");
}
}
|