2023年8月3日发(作者:)
javasocket报⽂解析_javasocket解析和发送⼆进制报⽂⼯具(附java和C。。。解析:⾸先是读取字节:/*** 读取输⼊流中指定字节的长度** 输⼊流**@paramlength 指定长度*@return指定长度的字节数组*/public static byte[] readBytesFromTo(byte[] buffer, int from, intlength) {byte[] sub = new byte[length];int cur = 0;for (int i =from; i < length + from; i++) {sub[cur]=buffer[i];cur++;}returnsub;}读取之后转为字符串或者整型:/*** byte[]转int**@parambytes 报⽂*@returnInteger*/public static int byteArrayToInt(byte[] bytes) {int value = 0;//由⾼位到低位for (int i = 0; i < 4; i++) {int shift = (4 - 1 - i) * 8;value+= (bytes[i] & 0x000000FF) << shift;//往⾼位游}returnvalue;}/*** 字节转字符串*@parambytes 报⽂*/public static String byteArrayToString(byte[] bytes,int start , int end){return newString(bytes, start, end);}发送报⽂:将java类型转化为⼆进制:/***@parami*@return*/public static byte[] intToByteArray(inti) {byte[] result = new byte[4];result[0] = (byte) ((i >> 24) & 0xFF);result[1] = (byte) ((i >> 16) & 0xFF);result[2] = (byte) ((i >> 8) & 0xFF);result[3] = (byte) (i & 0xFF);returnresult;}/****@params*@return*/public static byte[] StringToByteArray(String s) {es();}整合⼆进制数组:/****@parambytes*@return*/public static byte[] combineByte(byte[] ... bytes){int length = 0;for (byte[] b : bytes) {length+=;}byte[] allByte=new byte[length];int positon=0;for (byte[] b : bytes) {opy(b,0, allByte, positon, );positon+=;}returnallByte;}求校验和:/****@paraminput*@return*/public static int getCheckSum(byte[]... input) {int re = 0;for (byte[] b : input) {for (byteaB : b) {re+= aB & 0x0FF;//注意此处要转化为⽆符号}}returnre;}⼆进制内容有时候要在不同的环境下解析和发送,下⾯是C++和java的字符差异下⾯给出在不同字符集编码下的字节数:英⽂字母:字节数 : 1;编码:GB2312 字节数: 1;编码:GBK 字节数 : 1;编码:GB18030字节数 : 1;编码:ISO-8859-1 字节数: 1;编码:UTF-8 字节数 : 4;编码:UTF-16字节数 : 2;编码:UTF-16BE 字节数: 2;编码:UTF-16LE中⽂汉字:字节数 : 2;编码:GB2312 字节数: 2;编码:GBK 字节数 : 2;编码:GB18030字节数 : 1;编码:ISO-8859-1 字节数: 3;编码:UTF-8 字节数 : 4;编码:UTF-16字节数 : 2;编码:UTF-16BE 字节数: 2;编码:UTF-16LE编码不同会影响解析的⽅式的差异,有时候还是蛮头疼的,⽐如我们常⽤的中⽂问题,C++默认⽤GB2312编码,所以java的解析要变⼀下:String describe = new String(bytes, start += 4, describeLength, e("GB2312"));
2023年8月3日发(作者:)
javasocket报⽂解析_javasocket解析和发送⼆进制报⽂⼯具(附java和C。。。解析:⾸先是读取字节:/*** 读取输⼊流中指定字节的长度** 输⼊流**@paramlength 指定长度*@return指定长度的字节数组*/public static byte[] readBytesFromTo(byte[] buffer, int from, intlength) {byte[] sub = new byte[length];int cur = 0;for (int i =from; i < length + from; i++) {sub[cur]=buffer[i];cur++;}returnsub;}读取之后转为字符串或者整型:/*** byte[]转int**@parambytes 报⽂*@returnInteger*/public static int byteArrayToInt(byte[] bytes) {int value = 0;//由⾼位到低位for (int i = 0; i < 4; i++) {int shift = (4 - 1 - i) * 8;value+= (bytes[i] & 0x000000FF) << shift;//往⾼位游}returnvalue;}/*** 字节转字符串*@parambytes 报⽂*/public static String byteArrayToString(byte[] bytes,int start , int end){return newString(bytes, start, end);}发送报⽂:将java类型转化为⼆进制:/***@parami*@return*/public static byte[] intToByteArray(inti) {byte[] result = new byte[4];result[0] = (byte) ((i >> 24) & 0xFF);result[1] = (byte) ((i >> 16) & 0xFF);result[2] = (byte) ((i >> 8) & 0xFF);result[3] = (byte) (i & 0xFF);returnresult;}/****@params*@return*/public static byte[] StringToByteArray(String s) {es();}整合⼆进制数组:/****@parambytes*@return*/public static byte[] combineByte(byte[] ... bytes){int length = 0;for (byte[] b : bytes) {length+=;}byte[] allByte=new byte[length];int positon=0;for (byte[] b : bytes) {opy(b,0, allByte, positon, );positon+=;}returnallByte;}求校验和:/****@paraminput*@return*/public static int getCheckSum(byte[]... input) {int re = 0;for (byte[] b : input) {for (byteaB : b) {re+= aB & 0x0FF;//注意此处要转化为⽆符号}}returnre;}⼆进制内容有时候要在不同的环境下解析和发送,下⾯是C++和java的字符差异下⾯给出在不同字符集编码下的字节数:英⽂字母:字节数 : 1;编码:GB2312 字节数: 1;编码:GBK 字节数 : 1;编码:GB18030字节数 : 1;编码:ISO-8859-1 字节数: 1;编码:UTF-8 字节数 : 4;编码:UTF-16字节数 : 2;编码:UTF-16BE 字节数: 2;编码:UTF-16LE中⽂汉字:字节数 : 2;编码:GB2312 字节数: 2;编码:GBK 字节数 : 2;编码:GB18030字节数 : 1;编码:ISO-8859-1 字节数: 3;编码:UTF-8 字节数 : 4;编码:UTF-16字节数 : 2;编码:UTF-16BE 字节数: 2;编码:UTF-16LE编码不同会影响解析的⽅式的差异,有时候还是蛮头疼的,⽐如我们常⽤的中⽂问题,C++默认⽤GB2312编码,所以java的解析要变⼀下:String describe = new String(bytes, start += 4, describeLength, e("GB2312"));
发布评论