java处理16进制字符串的一些方法和基础知识

news2024/9/27 17:28:59

前言:本篇文章是对于基础数据的处理的一些简单经验总结里边包含了一些基础的数据储存和数据转化的一些知识,同样也包含有部分快捷的数据处理方法。主要用于个人知识的一个记录和方便进行对应的数据转换和处理。

1、bit,字节和字的关系

1.1 bit和字节的互相转化

比特的基础定义

  • 比特

  • 表示二进制位

  • 11010100是一个8位二进制数

  • 计算机存储信息的最小单位

字,字节和位的关系
  • 1位=1比特

  • 1Byte=8bit

  • 1字=2字节

  • 1字节=8位

  • 1字=16位

bit和字节的转化实例

bit和字节在转化时往往有些分不清具体bit是如何计算位数的,故留此图做分辨

bit和字节互相转化的代码

bit和字节其实可以通过Integer的toBinaryString和toHexString进行16进制和二进制的互相转化,但为了能在程序中便捷的操作每个bit位,故总结了以下方法实现16进制字符串转化为2进制字符串

/**
* 16进制字符转化为二进制字符串
* @param hex
* @return String
*/
public static String hexStringToBitString(String hex) {
        byte[] bytes = hexStr2Byte(hex);
        return byteToBitString(bytes);
}

public static String byteToBitString(byte[] bytes) {
       String res = "";
       for (Byte aByte : bytes) {
       String binaryString = Integer.toBinaryString(aByte);
       int length = binaryString.length();
            if (length < 8) {
                for (int i = 0; i < 8 - length; i++) {
                    binaryString = "0" + binaryString;
                }
            }
            res = binaryString.substring(binaryString.length() - 8);
        }
        return res;
}

//二进制字符串转16进制
String a = "11011";
String b = Integer.toHexString(Integer.parseInt(a, 2));
System.out.println("二进制"+a+",转换为十六进制为:"+b);

1.2、多字的存储和解析

在我们使用计算机时,往往不可能单纯使用1个字节进行数据的传输,往往会使用多个字节进行传输和存储,因此,此时便涉及到另两个数据存储名词——大端存储和小端存储

基础概念

大端是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,地址由小向大增加,而数据从高位往低位放;

小端是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

假设有一个整型数0x12345678,从图中可以看出明显的区别:

因此,我们在处理数据时也要考虑这个问题,一般来说,大端存储的数据是符合我们读取和解析的习惯的,但对于小端存储的数据,我们就需要做对应的处理。

处理方法
在Java中,我们常常使用截取并倒置单个字的形式来处理小端数据,具体数据处理代码如下,以下是四个字节代码的处理方式,我们可以根据字段长度进行对应拓展。

/**
* 该方法将高低位进行转换
* 许转换的高于2字节,char,unsignChar ,int等
* @param hex : 需要反转的数据
* @return
*/
public static String parseHexString(String hex) {
        String res = "";
        if (hex.length() % 2 != 0) {
            throw new RuntimeException("数据长度错误!");
        }
        switch (hex.length()) {
            case 4 :
                res = hex.substring(2, 4) + hex.substring(0, 2);
                break;
            case 6 :
                res = hex.substring(4, 6) + hex.substring(2, 4) + hex.substring(0, 2);
                break;
            case 8 :
                res = hex.substring(6, 8) + hex.substring(4, 6) + hex.substring(2, 4) + hex.substring(0, 2);
                break;
            case 16 :
                res = hex.substring(14, 16) + hex.substring(12, 14) + hex.substring(10, 12) + hex.substring(8, 10) +
                        hex.substring(6, 8) + hex.substring(4, 6) + hex.substring(2, 4) + hex.substring(0, 2);
        }
        return res;
}

2、ASCII码,ANSI码和16进制字符串的转化

2.1 基础定义

ASCII码
  • American Standard Code for Information Interchange, 叫做“美国信息交换标准码”。

  • 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间

ANSI码

ANSI编码是一种对ASCII码的拓展 ANSI编码用0x00–0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符 超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符

2.2、相关转化方法和测试

//ASCII转str   
public static String strToAscii(String str) {
        StringBuilder builder = new StringBuilder();
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            builder.append((int)chars[i]);
        }
        return builder.toString();
}

//IntStr转ASCII   
public static String asciiToIntStr(String asc) {
        char[] chars = asc.toCharArray();
        StringBuilder r = new StringBuilder();
        for (char aChar : chars) {
            r.append(Integer.toHexString((int) aChar));
        }
        return r.toString();
}

//测试程序
public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入数据~~");
        String msg = scanner.nextLine();
        String b = ParseUtils.asciiToIntStr(msg);
        System.out.println(b);
        System.out.println("你输入的是:"+msg);
}

3、java处理负数

16进制的负数一般是以FF做开头的,我们在处理数据的时候也会用到不同的方法,常见的包括补齐数位,然后进行相应转化:

/**
* 16进制求十进制真值
*/
public static Integer getComplement(String data) {
        if (data == null || "".equals(data)) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        int i =0;
        while (i < data.length()) {
            i++;
            sb.append("F");
        }

        String binaryString = Integer.toBinaryString(Integer.valueOf(data,16));
        while (binaryString.length()<16){
            binaryString="0"+binaryString;
        }
        if (binaryString.toUpperCase().startsWith("1")) {
            // 默认补码代表负数
            return - (Integer.valueOf(sb.toString(), 16) - Integer.valueOf(data, 16) + 1);
        } else {
            return Integer.valueOf(data, 16);
        }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1387256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 24两两交换链表中的节点

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 思想 对于操作链表节点的时候&#xff0c;首先需要就是创建一个虚拟的…

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…

OPT(erlang)打造一套缓存系统(一)

缓存的设计 这个简易缓存存储的是键/值对&#xff0c;其中键与键之间不得重复&#xff0c;并且每个键只能映射到一个值。这个设计背后的核心思想是为写人缓存的每一个值都分配一个独立的存储进程再将对应的键映射至该进程。你可能会对这种为每个值分配一个进程的设计感到惊讶&…

2024年学鸿蒙开发就业前景怎么样?

随着科技的不断进步&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;逐渐引起了人们的关注。 2024年&#xff0c;鸿蒙开发就业前景如何&#xff1f; 对于那些对鸿蒙开发感兴趣并希望在这一领域寻找职业发展的人来说&#xff0c;这是一个非常重要的问题。 首先&a…

【电子取证篇】蘇小沐的电子取证工具合集在线文档

【电子取证篇】蘇小沐的电子取证工具合集在线文档 弄成了在线表格&#xff0c;记得及时保存&#xff1b;工具永远只是辅助&#xff0c;但不要过多依赖自动化&#xff0c;有难度说明可以提升&#xff0c;既要不断学习也要不停思考&#xff0c;知行合一—【蘇小沐】 【腾讯文档…

springboot项目启动时横幅修改

正常情况下&#xff0c;springboot启动时的横幅&#xff08;banner&#xff09;长这样 自定义banner 在resource下创建banner.txt&#xff0c;写入想要修改的内容即可 程序无bugSpring Boot Version: ${spring-boot.version}// _ooOoo_ …

力扣-刷MySQL(详细解析)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

16 命令行模式

命令行模式 将行为的执行与与行为的调用通过命令分离&#xff0c;行为的的调用者不需要知道具体是哪个类执行的&#xff0c;他们之间通过命令连接。 demo的目录结构 命令的执行者&#xff08;接口&#xff09; package behavioralpattern.commandpattern.actuator;import ja…

2024年腾讯云服务器多少钱1年?超便宜62元一年

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

Github项目推荐-clone-voice

项目地址 GitHub - jianchang512/clone-voice 项目简述 一个声音ai工具。基于python编写。作用是音色复用。下面是官方说明&#xff1a;“这是一个声音克隆工具&#xff0c;可使用任何人类音色&#xff0c;将一段文字合成为使用该音色说话的声音&#xff0c;或者将一个声音使…

新火种AI|GPT-5前瞻!GPT-5将具备哪些新能力?

作者&#xff1a;小岩 编辑&#xff1a;彩云 Sam Altman在整个AI领域&#xff0c;乃至整个科技领域都被看作是极具影响力的存在&#xff0c;而2023年OpenAI无限反转的宫斗事件更是让Sam Altman刷足了存在感&#xff0c;他甚至被《时代》杂志评为“2023年度CEO”。 也正因此&…

Modbus协议学习第二篇之Modbus poll slave仿真软件初体验

软件准备 学习Modbus离不开硬件&#xff0c;好在我们可以通过仿真软件来模拟硬件&#xff0c;本篇博客就来简单介绍一下Modbus仿真软件的最基础使用方法&#xff0c;需要用到的3款仿真软件如下&#xff1a; Modbus Poll 64位 / Modbus Poll 32位&#xff08;根据自己机器位数选…

【Python学习】Python学习14-函数

目录 【Python学习】Python学习14-函数 前言自定义函数创建语法自定义函数与调用参数传递参考 文章所属专区 Python学习 前言 本章节主要说明Python的函数。函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应…

自定义vector的实现

实现前需要思考的一个问题 为什么需要将空间的申请与对象的构建分开 查看vector的模板参数时可以看到其有第三个参数是空间适配器allocator&#xff0c;查找其对外提供的成员函数不难发现它的实现逻辑是将空间的申请与对象的构建分开的&#xff0c;为什么呢&#xff1f;不弄清…

云畅科技技术中心被认定为湖南省省级企业技术中心

近日&#xff0c;湖南省工业和信息化厅公布《2023年第二批湖南省省级企业技术中心(第29批)》&#xff0c;云畅科技技术中心作为研发设计型代表入选。 省级企业技术中心是强化企业技术创新主体地位&#xff0c;增强企业自主创新能力&#xff0c;推动工业企业高质量发展的一个重要…

搬运5款帮你优化电脑的小工具软件

​ 你想让你的电脑更好用吗&#xff1f;这里有五款电脑软件可以帮你&#xff0c;它们可以让你的电脑更高效、美观、安全&#xff0c;快来看看吧&#xff01; 1.窗口管理——MaxMax ​ MaxMax是一款窗口管理软件&#xff0c;可以让你自定义窗口的最大化行为&#xff0c;避免窗…

STC8H8K蓝牙智能巡线小车——2. 点亮左右转弯灯与危险报警灯

任务调用示例 RTX 51 TNY 可做多任务调度&#xff0c;API较为简单。 /* 接口API */// 创建任务 extern unsigned char os_create_task (unsigned char task_id); // 结束任务 extern unsigned char os_delete_task (unsigned char task_id);// 等待 extern unsig…

Ubuntu20.04下A-LOAM配置安装及测试教程(包含报错问题踩坑)

参考文章&#xff1a; ubuntu20.04下ros运行A-LOAM Ubuntu20.04下运行LOAM系列&#xff1a;A-LOAM、LeGO-LOAM、SC-LeGO-LOAM、LIO-SAM 和 LVI-SAM 需要学习源码的同学可以下载LOAM论文 LOAM论文链接 1.需要安装的库文件 1.1Eigen 3.3 可以直接使用apt命令安装&#xff0c;或…

C#,字符串匹配(模式搜索)AC(Aho Corasick)算法的源代码

Aho-Corasick算法简称AC算法&#xff0c;也称为AC自动机(Aho-Corasick)算法&#xff0c;1975年产生于贝尔实验室&#xff08;The Bell Labs&#xff09;&#xff0c;是一种用于解决多模式字符串匹配的经典算法之一。 the Bell Lab 本文的运行效果&#xff1a; AC算法以模式树…

Android 13.0仿ios的hotseat效果修改hotseat样式

1.概述 在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了 效…