Java语言 ASCII to Hex 互转(IOT-示例)

2023-11-19

概述

        最近想起之前做的IOT项目,使用JAVA写了一个<ascii to hex> 示例,防止误删,在此做个笔录,方便后续查阅;同时,希望能帮助到有用的攻城狮们,加油加油!

IDE:IntelliJ IDEA 2020.2
JDK:jdk-11.0.8_windows-x64_bin.exe

一、代码

public class Main {
    public static void main(String[] args) throws NumberFormatException {
        System.out.println("\n***** Convert ASCII to Hex *****");
        //String str = "I Love Java!";
        String str = "862177040021951";
//        String str = "163";
        System.out.println("Original input : " + str);

        String hex = convertStringToHex(str);

        System.out.println("\n***** Convert Hex to ASCII *****");
        System.out.println("Hex : " + hex);
        System.out.println("ASCII : " + convertHexToString(hex));

        String val = "343630313131313734333036393430";
        System.out.println("NB-IOT设备的IMEI号值为:" + convertHexToString(val));

        System.out.println("****************************************************\n");

        hex = convertStringToHex("460111174306940");
        System.out.println("\n***** Convert Hex to ASCII *****");
        System.out.println("Hex : " + hex);
        System.out.println("ASCII : " + convertHexToString(hex));

        String vall = "226";
        System.out.println("NB-IOT设备的IMSI号值为:" + convertHexToString(vall));

//        System.out.println("******************************************\n");
//        String Latitude = "10D17C0D";
//        System.out.println("经度值为:" + convertHexToFloat(Latitude));

//        System.out.println("******************************************\n");
//        String Longitude = "80C9DD43";
//        System.out.println("纬度值为:" + convertHexToFloat(Longitude));

//        String s="80C9DD43";
//        Float value = Float.intBitsToFloat(Integer.valueOf(s.trim(), 16));
//        System.out.println(value);
//
//        Float f=0.15490197f;
//        System.out.println(Integer.toHexString(Float.floatToIntBits(f)));

        Test test = new Test();
        String str16 = "M5311-MCMH0S03,HT_Manhole_V2.1_191209,HT_12221_V2.0_190715,868163040748607,460040829606402,898602B8261870737402,19/12/10,14:01:41,2,2,0,255,255,16,21,3.80,24.9,0,0,86,0";
        String crc2Code = test.getCRC2Code(str16.getBytes());
        System.out.println("crc2Code:" + crc2Code);
        System.out.println("len:" + str16.length());
        System.out.println("len:" + str16.getBytes().length);

    }

    public static String convertStringToHex(String str) {

        char[] chars = str.toCharArray();

        StringBuffer hex = new StringBuffer();
        for (int i = 0; i < chars.length; i++) {
            hex.append(Integer.toHexString((int) chars[i]));
        }

        return hex.toString();
    }

    public static String convertHexToString(String hex) {

        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();

        //49204c6f7665204a617661 split into two characters 49, 20, 4c...
        for (int i = 0; i < hex.length() - 1; i += 2) {

            //grab the hex in pairs
            String output = hex.substring(i, (i + 2));
            //convert hex to decimal
            int decimal = Integer.parseInt(output, 16);

            //convert the decimal to character
            sb.append((char) decimal);

            temp.append(decimal);
        }
        System.out.println("Decimal : " + temp.toString());

        return sb.toString();
    }

    public static String convertHexToFloat(String hex) {

        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();

        return sb.toString();
    }

    public static class Test {
        public String getCRC2Code(byte[] bytes) {
//        ModBus 通信协议的 CRC ( 冗余循环校验码含2个字节, 即 16 位二进制数。
//        CRC 码由发送设备计算, 放置于所发送信息帧的尾部。
//        接收信息设备再重新计算所接收信息 (除 CRC 之外的部分)的 CRC,
//        比较计算得到的 CRC 是否与接收到CRC相符, 如果两者不相符, 则认为数据出错。
//
//        1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。
//        2) 把第一个 8 位二进制数据 (通信信息帧的第一个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。
//        3) 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位。
//        4) 如果移出位为 0, 重复第 3 步 ( 再次右移一位); 如果移出位为 1, CRC 寄存器与多项式A001 ( 1010 0000 0000 0001) 进行异或。
//        5) 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进行了处理。
//        6) 重复步骤 2 到步骤 5, 进行通信信息帧下一个字节的处理。
//        7) 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。
//        8) 最后得到的 CRC寄存器内容即为 CRC码。

            int CRC = 0x0000ffff;
            int POLYNOMIAL = 0x0000a001;

            int i, j;
            for (i = 0; i < bytes.length; i++) {
                CRC ^= (int) bytes[i];
                for (j = 0; j < 8; j++) {
                    if ((CRC & 0x00000001) == 1) {
                        CRC >>= 1;
                        CRC ^= POLYNOMIAL;
                    } else {
                        CRC >>= 1;
                    }
                }
            }
            //高低位转换,看情况使用(通讯开发就规定校验码高位在前低位在后,也就不需要转换高低位)
            //CRC = (CRC & 0x0000FF00) >> 8 | ( (CRC & 0x000000FF ) << 8);
            return Integer.toHexString(CRC);
        }
    }

    public static long parseLong(String s, int radix) throws NumberFormatException {
        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX");
        }
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX");
        }

        long result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        long limit = -Long.MAX_VALUE;
        long multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Long.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++), radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
    }

}


class NumberFormatException extends IllegalArgumentException {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public NumberFormatException(String s) {
        super(s);
    }

    static NumberFormatException forInputString(String s) {
        return new NumberFormatException("For input string: \"" + s + "\"");
    }
}

二、运行结果

三、总结

        多劳多得,加油加油 ^_^ !!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java语言 ASCII to Hex 互转(IOT-示例) 的相关文章

  • ★教程2:fpga学习教程入门100例目录

    1 订阅本教程用户可以免费获得本博任意2个 包括所有免费专栏和付费专栏 博文对应代码 私信博主给出代码博文的链接和邮箱 2 本FPGA课程的所有案例 部分理论知识点除外 均由博主编写而成 供有兴趣的朋友们自己订阅学习使用 未经本人允许 禁止
  • AI系统论文阅读:SmartMoE

    提出稀疏架构是为了打破具有密集架构的DNN模型中模型大小和计算成本之间的连贯关系的 最著名的MoE MoE模型将传统训练模型中的layer换成了多个expert sub networks 对每个输入 都有一层special gating n
  • 这款毕设至少得收一千五,Python实现学生教师刷脸签到系统。

    背景 今天我在母校群又接到了一个做毕业设计的单子 论题 用Python或者Java实现学生教师刷脸签到系统 一般来讲做学生信息管理系统收500 这个大家觉得报价1500贵吗 我先带大家看干货 简介 利用Python语言 Flask框架 Dl

随机推荐

  • mysql查询时加不加引号的问题

    在查询mysql时碰到了查询条件加引号和不加引号的问题 一 如果字段本身是int类型 如果查询条件中加了引号 比如select from user where id 4 这时候可以查出id 4的用户信息 但是使用select from us
  • 打开mysql的步骤。

    安装mysql软件之后 打开mysql 显示error Can t connect to MySQL server on localhost 10061 原因是服务器没开 这个时候workbench连接不上 然后client登录不上 总结m
  • 2023华为OD机试真题【星际篮球争霸赛/动态规划】

    题目描述 在星球争霸篮球赛对抗赛中 最大的宇宙战队希望每个人都能拿到MVP MVP的条件是单场最高分得分获得者 可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场 并且让所有得分的选手得分都相同 然而比赛过程中的每1分钟的得分都只能由某一
  • Radxa Rock 3a NPU调用指南

    0x0 Radxa Rock 3a开发板介绍 Radxa Rock 3a开发板是基于瑞芯微RK3568芯片设计的 ARM CPU采用4核Cortex A55 Cortex A53的继任者 主频最高可达2 0Ghz CPU性能相当于中高端手机
  • paramiko sftp 问题记录

    paramiko 是一款非常优秀得远程ssh库 能够ssh远程到主机 并执行命令 而且还能通过sftp连接主机 笔者得测试环境 因为安全关系 ssh默认端口修改成其他端口 再往上查阅资料 连接sftp 代码 t paramiko Trans
  • 坐标移动c语言,C语言 坐标移动详解及实例代码

    搜索热词 题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字
  • 【狂神说】Mybatis学习笔记(全)

    文章目录 前言 1 简介 1 1 什么是MyBatis 1 2 如何获得Mybatis 1 3 持久化 1 3 1 数据持久化 1 3 2 为什么需要持久化 1 4 持久层 1 5 为什么需要MyBatis 2 第一个Mybatis程序 2
  • 《IT项目管理》-大题&计算题保分秘籍

    经过今天的努力 已经把大部分大题和计算题全部总结完了 希望对你们有用 查看链接自取 百度网盘 APP即可获取 链接 https pan baidu com s 1U0EFY23KgTtM8lKlYnjrug pwd tehx 提取码 teh
  • 软考-嵌入式系统设计师-笔记:历年专业英语题

    文章目录 2020年 2019年 2018年 2017年 2016年 2015年 2014年 2013年 2020年 题目 加粗的为各题答案 Fog computing is a mid layer between cloud data c
  • deepIn 、 DDE 系统桌面黑屏解决方案

    桌面黑屏有两种情况 1 桌面除了底部菜单栏 其它全是黑的 解决方案 Deepin sudo apt install reinstall dde DDE sudo apt fix broken install sudo apt install
  • 基于SpringBoot和vue的若依后台管理系统 部署

    RuoYi Vue是一款前后端分离的极速后台开发框架 基于SpringBoot和Vue 目录 一 准备 二 启动前端项目 解决报错 digital envelope routines unsupported 测试 三 启动后端项目 四 运行
  • 8个适合新手的Python小项目

    这是我挑出来的8个适合新手的小项目 涉及了爬虫 多线程 selenium PhantomJs itchat 邮件发送 crontab 命令行颜色显示 excel操作 PIL 识别验证码 首先说明 天下没有免费的午餐 每个项目平均下来2元多一
  • 根据子网掩码算出 IP 地址 的网络号和主机号

    我们如何根据子网掩码算出 IP 地址 的网络号和主机号呢 举个例子 比如 10 100 122 0 24 后面的 24表示就是 255 255 255 0 子网掩码 255 255 255 0 二进制是 11111111 11111111
  • Ant design Pro V5 +Typescript + Hooks + Umi + Dev + SpringBoot + mysql + redis + scrity 实现动态菜单权限管理

    Ant design Pro V5 Typescript Hooks Umi Dev SpringBoot mysql redis scrity 实现动态菜单权限管理 企业中台架构 1 app tsx页面配置 该页面集成了登陆权限控制 动态
  • Android实战系列(三)---级联菜单

    需求A 一级菜单 多级菜单联动 1 在activity上弹出多个pop窗口 达到父菜单与子菜单级联的效果 2 多个Activity页面相互的嵌套实现多级菜单 考虑 传值 数据结构的定义 之前在用前端写Android构造级联菜单出现过标题栏不
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • Finetuner+:为企业实现大模型微调和私有化部署

    如 ChatGPT GPT4 这样的大型语言模型就像是你为公司请的一个牛人顾问 他在 OpenAI Google 等大公司被预训练了不少的行业内专业知识 所以加入你的公司后 你只需要输入 Prompt 给他 介绍一些业务上的背景知识 他就能
  • 2021-01-08

    问题 F 有序数组中插入元素 时间限制 1 Sec 内存限制 128 MB 提交 2116 解决 967 提交 状态 讨论版 题目描述 输入n n lt 20 输入n个有序整数 降序或升序 插入元素e 使新序列仍按原来的排序规则为有序序列
  • 【Java】Java中的String类

    文章目录 一 认识 String 类 二 String 类的常用方法 2 1 构造方法 2 2 String 类对象之间的比较 2 3 字符串查找 2 4 字符串的转换 2 5 字符串替换 2 6 字符串拆分 2 7 字符串截取 2 8 字
  • Java语言 ASCII to Hex 互转(IOT-示例)

    概述 最近想起之前做的IOT项目 使用JAVA写了一个