精华内容
下载资源
问答
  • 通用16 进制解析类型,包含大小端,字符串,数组,字节,无符号整数,有符号整数,二进制等转换
  • 这两天在开发STM32的Modbus主站,就买了一个RS485总线的温湿度传感器来,温湿度传感器说明要求将传感器返回的Modbus报文数据转换为10进制后再除以10得到真实数据,以下是举例 Modbus主站发送报文: 01 04 00 01 00 ...
  • 把数据封按WebSocket协议封装为16进制解析服务端收到的WebSocket16进制包。
  • 小工具,经常做通讯报文分析,有些协议不是明文,很不好分析,可借助这个工具分析,现阶段只做了简单的功能,
  • 自定义串口通信协议16进制

    万次阅读 多人点赞 2018-08-27 16:02:38
    }//一帧数据共11字节 保存在数组Hex_data[11] 中 (4) 解析数据 *****(1) 解析出来的16进制数据一律按照unsigned char接收。 对于两个字节(16位)数据,高位左移八位加上低位,组合成16位数据。 将组合后的数据,强制...

    1.1 串口通信标准

    通过RS-232接口进行两个设备间的通信(异步传输,全双工通信)。

    接口标准:两种接口9pin(DB-9),25pin(DB-25),通常只有三根线:TXD(发送)、RXD(接收)、GND(接地)。

    传输距离:150pF/m的通信电缆,最大传输距离15m;普通双绞屏蔽线(9600pbs),最大传输距离35m。

    电气特性:对于TXD、RXD 逻辑1:-3V~-15V;逻辑0:+3~+15V (负逻辑电平)。对于RTS、CTS、DSR、DTR和DCD 信号有效(接通,ON状态,正电压

    展开全文
  • 通过j2se upd网络编程,发送报文。我这里只是客户端,修改数据库连接,主要是把数据库里面的图片(base64编码处理),拆成包,发送给服务端。
  • 基于Socket的十六进制数据解析 数据解析的思路 基本思路 消息结构体,存储从缓存中解析的数据; buffer 回调函数,从缓存中解析数据时调用; 循环队列,用于缓存接收到的数据; 关键实现: 把接收到的数据存储到...

    基于Socket的十六进制数据解析

    数据解析的思路

    基本思路

    1. 消息结构体,存储从缓存中解析的数据; buffer
    2. 回调函数,从缓存中解析数据时调用;
    3. 循环队列,用于缓存接收到的数据;
      关键实现:
    4. 把接收到的数据存储到缓存中,并准备解析;
    5. 递归解析消息

    客户端和服务器端

    1. 首先定义一个类存放消息中包含的信息;是实体类;类中包括客户端和服务端的两种消息;
      或者客户端和服务端分开写两个实体类存放消息;

    2. 根据一定的协议对其编解码,定义一个interface,提供序列化和反序列化方法,
      (1)toWire()根据一个特定的消息,将消息转换成字节序列;
      (2)formWire()根据相同的协议,对给定的字节序列解析,根据信息的内容返回一个消息类的实例;

    3. 实现接口的两个类,一个基于文本的编码方式,一个基于十六进制的编码方式;

      • 基于文本的编码方式:
        使用ASCII字符集对文本进行编码,消息开头是一个字符序列,用于快速将协议的消息和网 络中随机的垃圾消息区分开;
        对射发送/接收消息的布尔值,是否为服务器发送响应消息,标记对射的ID,编码成十进制;
        (1) toWire()简单的创建了一个字符串,该字符串包含了消息的所有字段,并通过空白符隔开。
        (2)fromWire()首先检查魔术字符串,如果在消息前没有魔术字符串,则抛出一个异常。

      注意程序对来源与网络的消息数据进行输入!

    • 基于十六进制的编码
      基于十六进制对消息进行编码的程序,与文本编码相反,十六进制使用固定大小的消息,每条消息由一个特殊的字节开始,该字节最高X位为一个魔术值,该字节的哪几位对布尔值进行了编码,消息的哪几个字节总是不变,消息的哪几个字节是ID值,只有响应消息的哪几个字节包含数据信息,字节序列的格式如下:
      <“id”><#acct>

    其中 = [#acct|event gg zone ] or
    当事件类型为NULL/ACK/DUH时data段为[]。当事件类型为ADM-CID时data段格式为[#acct|event gg zone];
    第一个<#acct>为主机账号;
    第一个<#acct>为安定宝ID;

    展开全文
  • 通信方式是socket,使用netty技术进行连接,客户端的数据类型是16进制;需要注意的地方: 1:读取16进制,我继承的是StringDecoder,在decode读取数据 @Override protected void decode(ChannelHandlerContext ...

      通信方式是socket,使用netty技术进行连接,客户端的数据类型是16进制;需要注意的地方:

    1:读取16进制,我继承的是StringDecoder,在decode读取数据

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        String HEXES = "0123456789ABCDEF";
        byte[] req = new byte[msg.readableBytes()];
        msg.readBytes(req);
        final StringBuilder hex = new StringBuilder(2 * req.length);
    
        for (int i = 0; i < req.length; i++) {
            byte b = req[i];
            hex.append(HEXES.charAt((b & 0xF0) >> 4))
                    .append(HEXES.charAt((b & 0x0F)));
        }
        out.add(hex.toString());
    
    }

    2:在解析16进制数据的时候注意大小端问题,socket是对TCP/IP协议的封装,TCP/IP协议规定了在网络上必须采用网络字节顺序,也就是大端模式;而windows和linux是使用的小端模式,所以在读取的时候需要转化为小端模式读取,一个字节没问题,但是多个字节时需要转换;后面的字节放前面,倒序排放;同个网络和平台可能没关系,例如java虚拟机内部已经进行了处理,但是跨平台的话需要注意;

    如:String msg = "00 BC 45";要先变成String str = "45 BC 00";

    3:如果是16进制转10进制,需要考虑对方正负号的影响,如果是字节以FF开头,一定要注意是否要取反。不需要的话就没关系,需要的话就记得转换

    if (sixteen.startsWith("FF")){
        Long max = Long.parseLong("FFFFFFFF", 16);
        Long curLong = Long.parseLong(sixteen, 16);
        pos[i] = new Long(curLong - max).intValue();
    }
    展开全文
  • 自定义简单的"投票"协议 程序支持两种请求。一种是查询( inquiry),即向服务器询问给定候选人当前获得的投票总数。服务器发回一个响应消息,包含了原来的候选人 ID和该候选人当前(查询请求收到时)获得的选票...

    自定义简单的"投票"协议

    程序支持两种请求。一种是查询( inquiry),即向服务器询问给定候选人当前获得的投票总数。服务器发回一个响应消息,包含了原来的候选人 ID和该候选人当前(查询请求收到时)获得的选票总数。另一种是投票( voting)请求,即向指定候选人投一票。服务器对这种请求也发回响应消息,包含了候选人 ID 和其获得的选票数(包括了刚投的一票)。


    VoteMsg.java是javabean, 包含每条信息中的基本信息

    public class VoteMsg {


    private boolean isInquiry; // true为查询; false为投票
    private boolean isResponse;// true为服务器响应
    private int candidateID; // 0<=candidateID<=1000
    private long voteCount; // 投票数


    public static final int MAX_CANDIDATE_ID = 1000;


    public VoteMsg(boolean isResponse, boolean isInquiry, int candidateID, long voteCount)
    throws IllegalArgumentException {
    // check invariants
    if (voteCount != 0 && !isResponse) {
    throw new IllegalArgumentException("Request vote count must be zero");
    }
    if (candidateID < 0 || candidateID > MAX_CANDIDATE_ID) {
    throw new IllegalArgumentException("Bad Candidate ID: " + candidateID);
    }
    if (voteCount < 0) {
    throw new IllegalArgumentException("Total must be >= zero");
    }
    this.candidateID = candidateID;
    this.isResponse = isResponse;
    this.isInquiry = isInquiry;
    this.voteCount = voteCount;
    }


    public void setInquiry(boolean isInquiry) {
    this.isInquiry = isInquiry;
    }


    public void setResponse(boolean isResponse) {
    this.isResponse = isResponse;
    }


    public boolean isInquiry() {
    return isInquiry;
    }


    public boolean isResponse() {
    return isResponse;
    }


    public void setCandidateID(int candidateID) throws IllegalArgumentException {
    if (candidateID < 0 || candidateID > MAX_CANDIDATE_ID) {
    throw new IllegalArgumentException("Bad Candidate ID: " + candidateID);
    }
    this.candidateID = candidateID;
    }


    public int getCandidateID() {
    return candidateID;
    }


    public void setVoteCount(long count) {
    if ((count != 0 && !isResponse) || count < 0) {
    throw new IllegalArgumentException("Bad vote count");
    }
    voteCount = count;
    }


    public long getVoteCount() {
    return voteCount;
    }


    public String toString() {
    String res = (isInquiry ? "inquiry" : "vote") + " for candidate " + candidateID;
    if (isResponse) {
    res = "response to " + res + " who now has " + voteCount + " vote(s)";
    }
    return res;
    }


    }


    Framer.java和LengthFramer.java是成帧器, 实现数据的发和接

    public interface Framer {

    void frameMsg(byte[] message, OutputStream out) throws IOException;
    byte[] nextMsg() throws IOException;

    }


    public class LengthFramer implements Framer {


    public static final int MAXMESSAGELENGTH = 65535;
    public static final int BYTEMASK = 0xff;
    public static final int SHORTMASK = 0xffff;
    public static final int BYTESHIFT = 8;


    private DataInputStream in; // wrapper for data I/O


    public LengthFramer(InputStream in) throws IOException {
    this.in = new DataInputStream(in);
    }


    public void frameMsg(byte[] message, OutputStream out) throws IOException {
    if (message.length > MAXMESSAGELENGTH) {
    throw new IOException("message too long");
    }
    // write length prefix
    out.write((message.length >> BYTESHIFT) & BYTEMASK);
    out.write(message.length & BYTEMASK);
    // write message
    out.write(message);
    out.flush();
    }


    public byte[] nextMsg() throws IOException {
    int length;
    try {
    length = in.readUnsignedShort(); // read 2 bytes
    } catch (EOFException e) { // no (or 1 byte) message
    return null;
    }
    // 0 <= length <= 65535
    byte[] msg = new byte[length];
    in.readFully(msg); // if exception, it's a framing error.
    return msg;
    }


    }


    VoteMsgCoder.java和VoteMsgBinCoder是关键代码, 实现解码和编码
    public interface VoteMsgCoder {

    byte[] toWire(VoteMsg msg) throws IOException;
    VoteMsg fromWire (byte[] input) throws IOException;


    }

    VoteMsgBinCoder.java是使用 二进制格式, 其大小固定。每条消息由一个特殊字节开始,该字节的最高六位为一个 "魔术"010101。这一点少量的冗余信息为接收者收到适当的投票消息提供了一定程度的保证。该字节的最低两位对两个布尔值进行了编码。消息的第二个字节总是 0,第三、第四个字节包含了 candidateID 值。只有响应消息的最后 8 个字节才包含了选票总数信息。

    /* Wire Format
     *                                1  1  1  1  1  1
     *  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
     * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
     * |     Magic       |Flags|       ZERO            |
     * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
     * |                  Candidate ID                 |
     * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
     * |                                               |
     * |         Vote Count (only in response)         |
     * |                                               |
     * |                                               |
     * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
     */

    public class VoteMsgBinCoder implements VoteMsgCoder{

     public static final int MIN_WIRE_LENGTH = 4;
     public static final int MAX_WIRE_LENGTH = 16;
     public static final int MAGIC = 0x5400;
     public static final int MAGIC_MASK = 0xfc00;
     public static final int MAGIC_SHIFT = 8;
     public static final int RESPONSE_FLAG = 0x0200;
     public static final int INQUIRE_FLAG =  0x0100;


     public byte[] toWire(VoteMsg msg) throws IOException {
       ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
       DataOutputStream out = new DataOutputStream(byteStream); // converts ints


       short magicAndFlags = MAGIC;
       if (msg.isInquiry()) {
         magicAndFlags |= INQUIRE_FLAG;
       }
       if (msg.isResponse()) {
         magicAndFlags |= RESPONSE_FLAG;
       }
       out.writeShort(magicAndFlags);
       // We know the candidate ID will fit in a short: it's > 0 && < 1000 
       out.writeShort((short) msg.getCandidateID());

       if (msg.isResponse()) {
         out.writeLong(msg.getVoteCount());
       }
       out.flush();
       byte[] data = byteStream.toByteArray();
       return data;
     }


     public VoteMsg fromWire(byte[] input) throws IOException {
       // sanity checks
       if (input.length < MIN_WIRE_LENGTH) {
         throw new IOException("Runt message");
       }
       ByteArrayInputStream bs = new ByteArrayInputStream(input);
       DataInputStream in = new DataInputStream(bs);
       int magic = in.readShort();
       if ((magic & MAGIC_MASK) != MAGIC) {
         throw new IOException("Bad Magic #: " +
       ((magic & MAGIC_MASK) >> MAGIC_SHIFT));
       }
       boolean resp = ((magic & RESPONSE_FLAG) != 0);
       boolean inq = ((magic & INQUIRE_FLAG) != 0);
       int candidateID = in.readShort();
       if (candidateID < 0 || candidateID > 1000) {
         throw new IOException("Bad candidate ID: " + candidateID);
       }
       long count = 0;
       if (resp) {
         count = in.readLong();
         if (count < 0) {
           throw new IOException("Bad vote count: " + count);
         }
       }


       return new VoteMsg(resp, inq, candidateID, count);
     }


    }


    使用TCP进行数据交互

    VoteClientTCP.java是客户端

    public class VoteClientTCP {

    public static final int CANDIDATEID = 888;

    public static void main(String args[]) throws Exception {
       
       String destAddr = "127.0.0.1";
       int destPort = 9090;


       Socket sock = new Socket(destAddr, destPort);
       OutputStream out = sock.getOutputStream();


       //使用二进制编码和解码, 还可以使用text编码
       VoteMsgCoder coder = new VoteMsgBinCoder();
       //基于长度的成帧器, 实现数据发和接
       Framer framer = new LengthFramer(sock.getInputStream());


       //实例化
       VoteMsg msg = new VoteMsg(false, true, CANDIDATEID, 0);
       //二进制编码
       byte[] encodedMsg = coder.toWire(msg);  


       //发送查询
       System.out.println("Sending Inquiry (" + encodedMsg.length + " bytes): ");
       System.out.println(msg);
       framer.frameMsg(encodedMsg, out);


       //发送投票
       msg.setInquiry(false);
       encodedMsg = coder.toWire(msg);
       System.out.println("Sending Vote (" + encodedMsg.length + " bytes): ");
       framer.frameMsg(encodedMsg, out);
       
       //接收查询
       encodedMsg = framer.nextMsg();
       msg = coder.fromWire(encodedMsg);
       System.out.println("Received Response (" + encodedMsg.length
                  + " bytes): ");
       System.out.println(msg);


       //接收投票
       msg = coder.fromWire(framer.nextMsg());
       System.out.println("Received Response (" + encodedMsg.length
              + " bytes): ");
       System.out.println(msg);
       
       sock.close();
     }
    }


    VoteServerTCP.java是服务端

    public class VoteServerTCP {

    public static void main(String args[]) throws Exception {




       int port = 9090;


       ServerSocket servSock = new ServerSocket(port);
       // Change Bin to Text on both client and server for different encoding
       VoteMsgCoder coder = new VoteMsgBinCoder();
       VoteService service = new VoteService();


       while (true) {
         Socket clntSock = servSock.accept();
         System.out.println("Handling client at " + clntSock.getRemoteSocketAddress());
         // Change Length to Delim for a different framing strategy
         Framer framer = new LengthFramer(clntSock.getInputStream());
         try {
           byte[] req;
           while ((req = framer.nextMsg()) != null) {
             System.out.println("Received message (" + req.length + " bytes)");
             VoteMsg responseMsg = service.handleRequest(coder.fromWire(req));
             framer.frameMsg(coder.toWire(responseMsg), clntSock.getOutputStream());
           }
         } catch (IOException ioe) {
           System.err.println("Error handling client: " + ioe.getMessage());
         } finally {
           System.out.println("Closing connection");
           clntSock.close();
         }
       }
     }
    }


    运行结果如下:


    展开全文
  • 这是一个16进制的字符串,分割原则如下: ![图片说明](https://img-ask.csdn.net/upload/201506/05/1433467942_145359.png) 每个分割标志位的后两位代表占位长度,不足位的补0,我可以分割出来这些字符串,但是我...
  • 我们先说一下通讯协议。通讯协议就是通讯双方共同遵循的一套规则,定义协议的原则是尽可能的简单以提高传输率,尽可能的具有安全性保证数据传输完整正确。基于这2点规则,我们一个通讯协议应该是这样的:头+数据长度...
  • struct.pack也就是将数据按照二进制的格式进行传输 #!/usr/bin/env python #coding:utf-8 __author__ = 'ferraborghini' ...#将16进制数据当做字节流传递
  • 时间 报警标志 状态 经度 纬度 高度 速度KM/H 方向 里程KM 附加信息或者统计数据(16进制显示) 2020-05-12 00:00:28 0x00000000 0x000C0002 107.474556 27.764491 736m 0.0 00 354846.5 附加信息:
  • 16进制转换工具类

    2020-01-09 09:14:58
    对接某第三方数据协议时其推送的是16进制数据,解析其数据用到了此工具类,特记录下,留着备用 ... 换点积分。或评论获取 主要方法: 将字节数组转换为十六进制字符数组 将字符串转换为十六进制字符数组 将...
  • BUPT 2012 计算机 ProblemD | 十六进制转十进制、getline(str)、getchar()
  • 使用js将16进制和浮点数互相转化

    千次阅读 2019-09-29 09:22:36
    最近在做一个蓝牙app的项目,其中有用到使用蓝牙与设备进行数据交互传输的过程,使用的都是16进制协议,对于我们做java开发的或者html,js的程序员来讲是有点晕的,下面贴出使用js将16进制与浮点数进行转换的js...
  • 读取CAN数据库 转换成16进制 标准数据背景数据编码格式CAN 数据矩阵如何转换 背景 当你在工作中,你只获得了CAN DB 文件,或者通信文档 当你在工作中,又缺少像CANoe 这种高大上的工具的时候 当你需要简发送信号的...
  • * 16进制字节转10进制数组。 * @param src * @return */ public static String bytesToHexString(byte[] src){ StringBuilder stringBuilder = new StringBuilder(""); if (src...
  • 16进制数转换成Float型数

    千次阅读 2020-10-12 20:50:26
    单片机与传感器通信,标准的MODBUS RTU协议。 到了数据解析部分,如何把4个字节的数据读出来,显示到屏幕呢? 单片机收到一帧数据,放入数组中,进行数据的拼凑,4个字节拼凑成一个32位的int型数据。然后再进行解析。...
  • 由我写的这个代码可以看出来 如果串口发送端发送的是2进制,那QT上位机的接收端 接受的也是 2进制 而一串二进制数怎么得到 相应的二进制 比如 22 55 ff 01 02 得到0x22则 list.at (0) 得到 0xff 则list.at (2) ...
  • 808协议的编码解码

    2018-06-15 17:37:18
    这段时间公司在做808协议的编码与解码,就专门做了一个工具类,方便自己的调用,有byte,Word,DWord,BCD类型的编码解码,还有普通的byte,int,string转换/2进制10进制16进制....等等
  • 1.综述 客户端与服务器交互时都需要双方协商,确定消息的二进制格式。客户端在向服务器发起请求时会根据协议创建二...随着业务的发展,原先某些字段得删除时,协议解析代码又得修改,因此自定义协议解析在面对协议变化
  • 所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以,权在此做一笔记,方便以后查看,以及需要帮助的童鞋,当然...
  • 进行协议解析时,总是会遇到各种各样的数据转换的问题,从二进制到十进制,从字节串到整数等等 整数之间的进制转换: 10进制转16进制: hex(16) ==> 0x10 16进制转10进制: int('0x10', 16) ==> 16 类似的还有...
  • 解析内容 String s="02 5f 00 01 00 08 00 b8 ca 41 38 39 31 38 36 02 00 04 00 e4 32 2e 06 03 00 04 00 6a f4 26 02 04 00 07 00 e2 07 02 0c 0c 21 15 05 00 04 00 77 54 01 00 06 00 02 00 14 00 07 00 02 00 ...
  • 文章目录问题点概括具体处理流程1、判断高位是否为12、转为二进制3、取反+14、转回16进制或10进制整体DemoTHE END 问题点概括        在做3D智慧城市大数据数字孪生系统时,...
  • 该通信协议源码以 16 位帧头位地址的数据打包和解析。拥有加密传输,16位和检验功能,简单易用,数据包大小可以定义(支持10 Byte~64 k Byte 的数据包大小),满足绝大部分32位单片机的需求,文件内置详细说明文档可...
  • 16进制的byte数组转换成字符串getBufHexStr方法的代码段:  //将16进制的byte数组转换成字符串 public static String getBufHexStr(byte[] raw){ String HEXES = "0123456789ABCDEF"; if ( raw == null ...
  • 进行协议解析时,总是会遇到各种各样的数据转换的问题,从二进制到十进制,从字节串到整数等等 废话不多上,直接上例子 整数之间的进制转换: 10进制转16进制: hex(16) ==> 0x10 16进制转10进制: int('0x10', ...
  • DHCP release报文16进制 解析

    千次阅读 2019-05-12 15:54:09
    以下是dhcp release报文的16进制分析方法,主要是为了人为的构造报文方便而分析的,请参考,主要是针对一开始比较害怕看那种的16进制的东西。后来看懂了,也就那么一回事。 Frame 67: 342 bytes on wire (2736 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,172
精华内容 27,268
关键字:

解析协议16进制