博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java socket解析和发送二进制报文工具(附java和C++转化问题)
阅读量:6320 次
发布时间:2019-06-22

本文共 2643 字,大约阅读时间需要 8 分钟。

解析:

首先是读取字节:

/**     * 读取输入流中指定字节的长度     * 

* 输入流 * * @param length 指定长度 * @return 指定长度的字节数组 */ public static byte[] readBytesFromTo(byte[] buffer, int from, int length) { byte[] sub = new byte[length]; int cur = 0; for (int i = from; i < length + from; i++) { sub[cur] = buffer[i]; cur++; } return sub; }

读取之后转为字符串或者整型:

/**     * byte[]转int     *     * @param bytes 报文     * @return Integer     */    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;// 往高位游        }        return value;    }  /**     * 字节转字符串     * @param bytes 报文     */    public  static String byteArrayToString(byte[] bytes,int start , int end){        return new String(bytes, start, end);    }

发送报文:

将java类型转化为二进制:

/**     * @param i     * @return     */    public static byte[] intToByteArray(int i) {        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);        return result;    }    /**     *      * @param s     * @return     */    public static byte[] StringToByteArray(String s) {        return s.getBytes();    }

整合二进制数组:

/**     *      * @param bytes     * @return     */    public    static byte[]  combineByte(byte[] ... bytes){        int length = 0;        for (byte[] b : bytes) {            length+=b.length;        }        byte[] allByte=new byte[length];        int positon=0;        for (byte[] b : bytes) {            System.arraycopy(b, 0, allByte, positon, b.length);            positon+=b.length;        }        return allByte;    }

求校验和:

/**     *     * @param input     * @return     */    public static int getCheckSum(byte[]... input) {        int re = 0;        for (byte[] b : input) {            for (byte aB : b) {                re += aB & 0x0FF;//注意此处要转化为无符号            }        }        return re;    }

二进制内容有时候要在不同的环境下解析和发送,下面是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, Charset.forName("GB2312"));

 

转载地址:http://dkcaa.baihongyu.com/

你可能感兴趣的文章
图数据库titan 和 rexster安装手册
查看>>
JS--switch 语句
查看>>
go-vim配置
查看>>
jetty配置jndi数据源
查看>>
php 调用系统命令 超时
查看>>
关于“性”
查看>>
android中级篇之多线程下载
查看>>
Silverlight删除数据表格中的数据,表格头部定义全选按钮,批量删除
查看>>
并查集
查看>>
《深入Ajax架构和最佳实践》读书笔记
查看>>
SAP HANA是什么
查看>>
一位游戏制作人的“页游之惑”
查看>>
Ffmpeg和SDL如何同步视频(转)
查看>>
php单例模式
查看>>
js渐变显示渐变消失
查看>>
[置顶] 重装系统的记录
查看>>
深入浅出之Smarty模板引擎工作机制(二)
查看>>
初探领域驱动设计(1)为复杂业务而生
查看>>
ORACLE EXP命令
查看>>
企业招聘要什么人
查看>>