From 8168b0b14dee8ac314dc32ac92ab907f89637384 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Sat, 4 Jun 2016 09:13:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4ProtocolPackager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skywalking/util/ProtocolPackager.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/ProtocolPackager.java diff --git a/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/ProtocolPackager.java b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/ProtocolPackager.java new file mode 100644 index 000000000..e162612c0 --- /dev/null +++ b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/ProtocolPackager.java @@ -0,0 +1,73 @@ +package com.ai.cloud.skywalking.util; + +import java.util.Arrays; + +public class ProtocolPackager { + public static byte[] pack(byte[] data) { + // 对协议格式进行修改 + // | check sum(4 byte) | data + byte[] dataPackage = new byte[data.length + 4]; + + packDataText(data, dataPackage); + packCheckSum(data, dataPackage); + + return dataPackage; + } + + private static void packCheckSum(byte[] data, byte[] dataPackage) { + byte[] checkSumArray = generateChecksum(data, 0); + System.arraycopy(checkSumArray, 0, dataPackage, 0, 4); + } + + private static void packDataText(byte[] data, byte[] dataPackage) { + System.arraycopy(data, 0, dataPackage, 4, data.length); + } + + + public static byte[] unpack(byte[] dataPackage) { + if (validateCheckSum(dataPackage)) { + return unpackDataText(dataPackage); + } else { + return null; + } + + } + + private static byte[] unpackDataText(byte[] dataPackage) { + byte[] data = new byte[dataPackage.length - 4]; + System.arraycopy(dataPackage, 4, data, 0, data.length); + return data; + } + + private static boolean validateCheckSum(byte[] dataPackage){ + byte[] checkSum = generateChecksum(dataPackage, 4); + byte[] originCheckSum = new byte[4]; + System.arraycopy(dataPackage, 0, originCheckSum, 0, 4); + return Arrays.equals(checkSum, originCheckSum); + } + + /** + * 生成校验和参数 + * + * @param data + * @return + */ + private static byte[] generateChecksum(byte[] data, int offset) { + int result = data[0]; + for (int i = offset; i < data.length; i++) { + result ^= data[i]; + } + + return intToBytes(result); + } + + private static byte[] intToBytes(int value) { + byte[] src = new byte[4]; + src[0] = (byte) ((value >> 24) & 0xFF); + src[1] = (byte) ((value >> 16) & 0xFF); + src[2] = (byte) ((value >> 8) & 0xFF); + src[3] = (byte) (value & 0xFF); + return src; + } + +}