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

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

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);
        }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么注册微商城?开启微商城之旅

在这个数字化时代&#xff0c;微商城的出现为商家提供了一个全新的机会&#xff0c;商家企业可以通过微商城来展示和销售自己的产品。而对于一些商家而言&#xff0c;不知道怎么注册微商城。下面给大家做一个简单的分享。 第一步&#xff1a;选择合适的微商城搭建工具 在注册…

移动通信系统关键技术多址接入OFDM学习(7)

1.OFDM是一种多载波传输方案&#xff0c;可以将高速串行传输转换为低速并行传输&#xff0c;增加符号持续时间&#xff0c;抗多径干扰能力强。 串行和并行有着不同的比特持续时间&#xff0c;同时拥有相同的数据速率。因此&#xff0c;虽然OFDM将串行信号转换为并行信号&#…

【好书推荐-第四期】《Go专家编程(第2版)》华为资深技术专家力作,第1版评分9.4,适合Go程序员面试

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection(CVPR2023)

文章目录 -Abstract & Conclusion现存问题解决方法结论 -问题方法Overviewaha&#xff0c;our work Dynamic PriorCoarse Prior MatchingFiner Dynamic Posterior Matching hh 源代码 - 该论文作者此前提出了RFLA&#xff0c;一种基于高斯接受场的标签分配策略 动态先验&a…

使用HTTP/2在Linux上的Nginx服务器进行优化

随着互联网的发展&#xff0c;HTTP/2协议逐渐成为主流。与传统的HTTP/1.1相比&#xff0c;HTTP/2提供了更高的传输效率和更好的安全性。在Linux上使用Nginx服务器进行优化&#xff0c;我们可以充分利用HTTP/2的优势&#xff0c;提高网站的性能和用户体验。 1. 安装Nginx并启用…

tessreact训练字库

tessreact主要用于字符识别&#xff0c;除了使用软件自带的中英文识别库&#xff0c;还可以使用Tesseract OCR训练属于自己的字库。 一、软件环境搭建 使用Tesseract OCR训练自己的字库&#xff0c;需要安装Tesseract OCR和jTessBoxEditor(配套训练工具)。jTessBoxEditor需要…

[ACM 学习] 最长上升子序列

LIS&#xff08;最长上升子序列&#xff09;的三种经典求法 - 一只不咕鸟 - 博客园 (cnblogs.com) 理解一下第三种方法&#xff08;贪心二分查找&#xff09; 因为构建的是上升子序列&#xff0c;所以是可以用二分查找找到最大的小于当前 A[i] 的在子序列中的 F[j]&#xff0…

【数据结构和算法】奇偶链表

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;分离节点后合并 三、代码 3.1 方法一&#xff1a;分离节点后合并 四、复杂度分…

CC工具箱使用指南:【提取特定文字】

一、简介 有时候我们会遇到一些混杂着各种中文、英文、数字、特殊符号的文字&#xff0c;需要对其进行提纯&#xff0c;如下图所示&#xff1a; 或者做规划的人应该做过一件事&#xff0c;从CAD测绘图中可以读取到类似【混3】、【砖2】的文字&#xff0c;如果想要从中提取出层…

Linux反向、分离解析与主从复制

前言 上篇介绍了DNS正向解析&#xff0c;本文将继续介绍反向解析与主从复制等内容。域名反向解析即从IP地址到域名的映射。为了完成逆向域名解析&#xff0c;系统提供一个特别域&#xff0c;该特别域称为逆向解析域。 目录 前言 一、反向解析 1. 配置bind服务 2. 修改区…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 理论题

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

《江苏联通数据安全体系建设》入选“星河”优秀案例

近日&#xff0c;国家信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同举办的第七届大数据“星河(Galaxy)”案例征集活动结果公布&#xff0c;江苏联通与天空卫士联合申报的《江苏联通数据安全体系建设》案例&#xff0c;被…

基于springboot的疫情物资捐赠和分配系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 课题背景 二…

vtk9.3 + Visual Studio2019 + Cmake3.28 win11 上的环境安装(这个过程网上比较多,自己记录下过程加深下印象)

开始 介绍 欢迎来到 VTK&#xff01;我们建议您首先阅读《VTK book》&#xff0c;这是一本全面的 VTK 指南&#xff0c;涵盖了其功能的所有方面。此外&#xff0c;您可能会发现探索 VTK 示例很有帮助&#xff0c;这是一组有用的参考资料&#xff0c;演示了如何使用 VTK 的不同模…

数学建模-预测人口数据

目录 中国09~18年人口数据 创建时间 绘制时间序列图 使用专家建模器 得到结果 预测结果 残差的白噪声检验 中国09~18年人口数据 创建时间 路径&#xff1a;数据-> 定义日期和时间 绘制时间序列图 使用专家建模器 看看spss最终判断是那个模型最佳的契合 得到结果 预…

Pandas十大练习题,掌握常用方法

文章目录 Pandas分析练习题1. 获取并了解数据2. 数据过滤与排序3. 数据分组4. Apply函数5. 合并数据6. 数据统计7. 数据可视化8. 创建数据框9. 时间序列10. 删除数据 代码均在Jupter Notebook上完成 Pandas分析练习题 数据集可从此获取&#xff1a; 链接: https://pan.baidu.co…

使用WAF防御网络上的隐蔽威胁之SQL注入攻击

SQL注入攻击是一种普遍存在且危害巨大的网络安全威胁&#xff0c;它允许攻击者通过执行恶意的SQL语句来操纵或破坏数据库。 这种攻击不仅能够读取敏感数据&#xff0c;还可能用于添加、修改或删除数据库中的记录。因此&#xff0c;了解SQL注入攻击的机制及其防御策略对于保护网…

YOLOv5姿态估计:HRnet实时检测人体关键点

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下利用YOLOv5进行姿态估计&#xff0c;HRnet与SimDR检测图片、视频以及摄像头中的人体关键点&#xff0c;欢迎大家一起前来探讨学习~ 本文目录&#xff1a; 一、项目准备1Pycharm中克隆github上的项目2.具体步…

【容器固化】 OS技术之OpenStack容器固化的实现原理及操作

1. Docker简介 要学习容器固化&#xff0c;那么必须要先了解下Docker容器技术。Docker是基于GO语言实现的云开源项目&#xff0c;通过对应用软件的封装、分发、部署、运行等生命周期的管理&#xff0c;达到应用组件级别的“一次封装&#xff0c;到处运行”。这里的应用软件&am…

UE 顶点动画工具 (VAT)

插件位置: Engine\Extras\3dsMaxScripts\VertexAnimationTools.ms 导出顶点动画贴图 导出帧数需要多一帧 导入模型需要勾选全精度UV 添加法线贴图 Normal_TS -> WS return normalize(V.x*TV.y*BV.z*N); VAT贴图 法线 位置