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

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

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

相关文章

2024全新开发API接口调用管理系统网站源码 附教程

2024全新开发API接口调用管理系统网站源码 附教程 用layui框架写的 个人感觉很简洁 方便使用和二次开发

腾讯云MPS为出海媒体企业助力

在如今互联网发达的时代&#xff0c;一个视频通过网络发布即可供给全球用户进行观看。其中视频媒体企业便其中的领头先锋&#xff0c;为了让创作者们以及全球各大用户的视频进行快速推广&#xff0c;出海则是不二之选。但是因为各地区域的不同&#xff0c;带宽的不同与网络的限…

深信服技术认证“SCSA-S”划重点:逻辑漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

桌面显示器type-c接口方案

在当今时代&#xff0c;TYPE-C接口桌面显示器已经成为了我们生活和工作中不可或缺的重要设备之一。与传统显示器相比&#xff0c;新型的TYPE-C接口桌面显示器具有更多的功能和优势&#xff0c;其中最显著的特点就是支持视频传输和充电功能。 首先&#xff0c;TYPE-C接口桌面显示…

Python Socketio 介绍

socketio是一个Python库&#xff0c;用于处理实时网络通信&#xff0c;它实现了Socket.IO协议。Socket.IO是一个JavaScript库&#xff0c;用于实时、双向和基于事件的通信。它在浏览器和服务器之间建立一个持久的连接&#xff0c;允许它们进行实时通信。 socketio.Client()是so…

【金猿人物展】白鲸开源CEO郭炜:数据要素是未来数据“新能源”产业么?

纵观2023年中国数据行业发展与2024年数据产业趋势&#xff0c;就不得不提到2023年全年国家全年强调的数据要素的概念以及在2023年12月中国国家数据局等17个部门联合印发了《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》。 从2020年-2023年政策发展脉络来看…

第九部分 使用函数 (五)

目录 一、origin 函数 “undefined” “default” “file” “command line” “override” “automatic” 二、shell 函数 三、控制 make 的函数 1、error 2、warning 一、origin 函数 origin 函数不像其它的函数&#xff0c;他并不操作变量的值&#xff0c;他只是…

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

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

【Git】GitHub上手动解决冲突

在 GitHub 上手动解决冲突通常涉及使用 Pull Request&#xff08;PR&#xff09;来进行合并。以下是一些基本的步骤&#xff0c;以帮助你手动解决冲突&#xff1a; 创建 Pull Request&#xff1a; 在 GitHub 仓库页面&#xff0c;切换到你的分支。 点击 “Pull Requests” 选…

可计算理论的优点及缺陷

可计算理论对计算机科学的发展和理论基础起到了重要的作用&#xff0c;它提供了计算问题可解性和不可解性的理论依据&#xff0c;并且对计算机算法的设计和性能分析有着重要的指导作用。同时&#xff0c;可计算理论也与形式语言、自动机理论、复杂性理论等其他计算科学领域有着…

关于steam游戏搬砖,想给大家的几点忠告

关于CSGO游戏搬砖&#xff0c;想给大家的几点忠告&#xff1a; 1、新出的箱子&#xff0c;里面开出的皮肤短时间内会溢价&#xff0c;价格虚高&#xff0c;后期会呈逐渐下跌趋势&#xff0c;这就是我们不让大家碰新品的原因&#xff0c;哪怕利润再高也不建议购入或者囤货&…

Linux Mii management/mdio子系统分析之五 PHY状态机分析及其与net_device的关联

&#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/u014044624/article/details/123303714 前面几章基本上完成了mdio模块驱动模型的分析&#xff0c;本篇文章主要讲述phy device的状态机以及phy device与net_device的关联。Phy device主要是对phy的抽象…

【Android开发】移动程序设计复习大纲

《移动程序设计》复习大纲 考试题型和分值&#xff1a; 一、判断题&#xff08;共10小题&#xff0c;每题1分&#xff0c;共10分&#xff09; 二、单选题(共10小题&#xff0c;每题1分&#xff0c;共10分) 三、填空题&#xff08;共10小题&#xff0c;每空1分&#xff0c;共…

C语言:自定义类型——结构体

一、什么叫做结构体 C语⾔已经提供了内置类型&#xff0c;如&#xff1a;char、short、int、long、float、double等&#xff0c;但是只有这些内置类型还是不够的&#xff0c;假设我想描述学⽣&#xff0c;描述⼀本书&#xff0c;这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 …

SMD NTC Thermistor NTC热敏电阻产品基本参数定义

热敏电阻器&#xff08;Thermistor&#xff09;是一种电阻值对温度极为灵敏的半导体元件&#xff0c;温度系数可分为Positive Temperature Coefficient 正温度系数热敏电阻又称PTC热敏电阻和Negative Temperature Coefficient 负温度系数热敏电阻又称NTC热敏电阻. NTC热敏电…

Seata分布式事务

文章目录 Seata分布式事务1.分布式事务问题1.1.本地事务1.2.分布式事务 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.2.1.下载3.2.2.解压3.2.3.修改配置3.2.4.在…

【JVM】常用命令

一、前言 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的基础设施&#xff0c;它负责将Java字节码转换为本地机器代码并执行。在开发过程中&#xff0c;我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令&#xff1a;jps、jstat…

Linux平台建立GB28181设备模拟器

目录 下载模拟器解决动态库缺少问题运行模拟器抓包参考资料 在没有GB28181摄像机的情况下,在Linux虚拟机中模拟出一台GB28181摄像机用于调试和学习. 下载模拟器 到网站下载Linux 平台版本: https://www.happytimesoft.com/download.html tar -zxvf happytime-gb28181-device…

Shell面试题总结

记录一下&#xff0c;面试背问到的shell的相关面试题。 1.shell中的加法实现方式 这里写三种方式拿53举例 result$((53)) resultexpr 53 resultecho 53 |bc2.shell判断文件是否存在的方式 也是三种 使用test命令 if test -f 文件路径;thenecho "文件存在" else…

P3817 小A的糖果

# 小A的糖果 ## 题目描述 小 A 有 $n$ 个糖果盒&#xff0c;第 $i$ 个盒中有 $a_i$ 颗糖果。 小 A 每次可以从其中一盒糖果中吃掉一颗&#xff0c;他想知道&#xff0c;要让任意两个相邻的盒子中糖的个数之和都不大于 $x$&#xff0c;至少得吃掉几颗糖。 ## 输入格式 输入…