解析:

首先是读取字节:

/**
* 读取输入流中指定字节的长度
* <p/>
* 输入流
*
* @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"));

java socket解析和发送二进制报文工具(附java和C++转化问题)的更多相关文章

  1. 基于JAVA Socket的底层原理分析及工具实现

    前言 在工作开始之前,我们先来了解一下Socket 所谓Socket,又被称作套接字,它是一个抽象层,简单来说就是存在于不同平台(os)的公共接口.学过网络的同学可以把它理解为基于传输TCP/IP协议 ...

  2. Java模拟POST请求发送二进制数据

    在进行程序之间数据通信时我们有时候就需要自定义二进制格式,然后通过HTTP进行二进制数据交互.交互的示例代码如下: public static void main(String[] args) { S ...

  3. Java Socket 服务端发送数据 客户端接收数据

    服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ...

  4. 使用Java Socket手撸一个http服务器

    原文连接:使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomc ...

  5. Java Socket编程基础篇

    原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...

  6. java基础解析系列(六)---深入注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...

  7. Java Socket/HttpURLConnection读取HTTP网页

    以读取百度的http网页为例.如果知道了IP地址和端口,然后新建一个Socket,就直接去读百度的首页,根本没反应,原因是www.baidu.com是以http协议传输的,而现在要以Socket原始的 ...

  8. java基础解析系列(六)---注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...

  9. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

随机推荐

  1. <hr/>标签改变颜色注意事项

    1.css改变颜色 <hr style="border:0;background-color:#093;height:1px;">   注意: 如果不加border:0 ...

  2. hdu_5036_Explosion(bitset优化传递闭包)

    题目链接:hdu_5036_Explosion 题意: 一个人要打开或者用炸弹砸开所有的门,每个门里面有一些钥匙,一个钥匙对应一个门,有了一个门的钥匙就能打开相应的门,告诉每个门里面有哪些门的钥匙,问 ...

  3. openwrt拦截snmp报文

    SNMP使用的协议为UDP,默认端口为161和162. 使用iptables 命令如下: iptables -A INPUT -p udp -m udp --dport 161:162 -j DROP ...

  4. HashMap解惑

    HashMap中有一些我们容易忽视的点 1. 关于key的hash和equals public V put(K key, V value) { if (table == EMPTY_TABLE) { ...

  5. LeetCode OJ 78. Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...

  6. Arch安装详解

    选择安装方式 CD/USB Arch启动盘安装 使用Arch启动盘比较简单方便,没有额外设置,直接阅读下一步. USB flash installation media 启动盘制作: USB flas ...

  7. 2016-02-03 JS正则表达式

    var reg = new RegExp("^(([1-9]{1,2})|100)$"); var strRate = $('#GOODS_SPEC_DEPOSIT_RATE'). ...

  8. 对AppStore中的项目进行评分(转载)

    在ios6.0前跳转到appstore评分一般是直接跳转到appstore评分NSString *evaluateString = [NSString stringWithFormat:@" ...

  9. 移动前端不得不了解的HTML5 head 头标签(中上篇)

    Meta 标签 meta标签是HTML中head头部的一个辅助性标签,它位于HTML文档头部的 <head> 和 <title> 标记之间,它提供用户不可见的信息.虽然这部分信 ...

  10. virtualbox+centos 7 实现宿主机器互通

    1.centos7iso文件 2.安装教程地址,www.aiplaypc.com/102.html 3.修改ip地址 使用命令 vi /etc/sysconfig/network-scripts/if ...