对于字节,16进制,2进制, 0xFF,位移的一些杂记

news2025/2/27 7:59:41

1.普通字符串95 对应的16进制的展示,使用工具查看如下图

下图为普通字符串

下图为95对应的16进制

 

 95对应的16进制字符串为39 35=》39代表一个字节  35代表另一个字节  (一个字节是由两位16进制字符串组成,比如39或35)

1个字节对应8个二进制数位

39 拆分为 3跟9  3对应的二进制0011  9对应的二进制1001 (共8位二进制)

35 拆分为 3跟5  3对应的二进制0011  5对应的二进制0101 (共8位二进制)

使用JAVA类进行测试

//95为普通字符串
String s12 = ConverterUtil.stringToHexString("95");//字符串转换为十六进制字符串
System.out.println("s12:"+s12);//打印结果为 3935
//95对应的16进制字符串为 39 35
byte[] bytes = "95".getBytes("GBK");
System.out.println(bytes.length);
//bytes[0] bytes[1]需要 ConverterUtil.byteToHex转成16进制字符串
System.out.println(bytes[0]);//值为57 57可能是ASCII,要通过 ConverterUtil.byteToHex来转化才是39  
System.out.println(bytes[1]);//值为53 53可能是ASCII,要通过 ConverterUtil.byteToHex来转化才是35  

//字节转为16进制字符串
byte num = bytes[0] ;
String s2 = ConverterUtil.byteToHex(num);
System.out.println("s2:" + s2);//39

num = bytes[1] ;
String s21 = ConverterUtil.byteToHex(num);
System.out.println("s21:" + s21);//35

//字节数组转为16进制字符串
String s7 = ConverterUtil.encodeHexString(bytes);
System.out.println("s7:"+s7);//相当于每个字节转16进制字符串 3935
//十六进制字符串转二进制转字符串
String s9 = ConverterUtil.hex2bin(s7);
System.out.println("s9:"+s9);//0011100100110101=>0011|1001|0011|0101=> 3 9 3 5

& 0xFF的意义及作用
&表示按位与,只有两个位同时为1,才能得到1
0x代表16进制数
0xFF表示的数二进制1111 1111
& 0xFF作用是为了取得低八位
例子 :0x1234
0x1234 表示为二进制 0001001000110100
0xFF表示为二进制 11111111
两个数做与操作 将0xFF补充到16位,就是高位补0 ,此时0xFF为 0000000011111111
与操作 1&0 =0,1&1 =1 这样 0x1234只能保留低八位的数 0000000000110100 也就是 0x34

& 0x1F作用是为了取得低五位
0x1F表示的数二进制0001 1111

&0x0F呢 作用是为了取得低四位
0x0F表示的数二进制0000 1111

位移用法

<< 左移运算符,右边空出的位用0填补,高位左移溢出则舍弃该高位:num << 1,相当于num乘以2
>> 右移运算符,左边空出的位用0或者1填,正数用0负数用1填,低位右移溢出则舍弃该位。num >> 1,即num除以2
>>>无符号右移,忽略符号位,空位都以0补齐

例子

((3 >>> 8) & 0xFF)  无符号右移8位,后再取低8位
((3 >>> 0) & 0xFF)  无符号右移0位,后再取低8位
0000,0000,0000,0011     3的二进制原码,
0000,0000,0000,0000     这是">>>8"的结果           
                  1111,1111       然后再 &0XFF     
                 0000,0000       最终结果   
这就得到了 3的原码0000,0000,0000,0011 的高8位(0000,0000)


0000,0000,0000,0011     3的二进制原码,
0000,0000,0000,0011     这是">>>0"的结果(还是源码本身不变)
                   1111,1111       然后再 &0XFF     
                  0000,0011       最终结果  
这就得到了 3的原码0000,0000,0000,0011 的低8位(0000,0011)

常见转化工具类

/**
 * 转换工具类
 */
public class ConverterUtil {

    /**
     * 字节转16进制字符串
     * @param num
     * @return
     */
    public static String byteToHex(byte num) {
        char[] hexDigits = new char[2];
        hexDigits[0] = Character.forDigit((num >> 4) & 0xF, 16);
        hexDigits[1] = Character.forDigit((num & 0xF), 16);
        String hexDigitsStr = new String(hexDigits) ;
        return hexDigitsStr;
    }

    /**
     * 16进制字符串转字节
     * @param hexString
     * @return
     */
    public static byte hexToByte(String hexString) {
        int firstDigit = toDigit(hexString.charAt(0));
        int secondDigit = toDigit(hexString.charAt(1));
        return (byte) ((firstDigit << 4) + secondDigit);
    }

    /**
     * 16进制字符串转10进制
     * @param hexChar
     * @return
     */
    private static  int toDigit(char hexChar) {
        int digit = Character.digit(hexChar, 16);
        if(digit == -1) {
            throw new IllegalArgumentException(
                    "Invalid Hexadecimal Character: "+ hexChar);
        }
        return digit;
    }

    /**
     * 字节数组转十六进制字符串
     * @param byteArray
     * @return
     */
    public static String encodeHexString(byte[] byteArray) {
        StringBuffer hexStringBuffer = new StringBuffer();
        for (int i = 0; i < byteArray.length; i++) {
            hexStringBuffer.append(byteToHex(byteArray[i]));
        }
        return hexStringBuffer.toString();
    }

    /**
     * 十六进制字符串转字节数组
     * bcd2hex跟decodeHexString结果一样
     * @param hexString  16进制字符串  如 9F33
     * @return
     */
    public static byte[] decodeHexString(String hexString) {
        if (hexString.length() % 2 == 1) {
            throw new IllegalArgumentException(
                    "Invalid hexadecimal String supplied.");
        }
        byte[] bytes = new byte[hexString.length() / 2];
        for (int i = 0; i < hexString.length(); i += 2) {
            bytes[i / 2] = hexToByte(hexString.substring(i, i + 2));
        }
        return bytes;
    }


    /**
     * 字符串转换为十六进制字符串
     * @param s
     * @return
     */
    public static String stringToHexString(String s) {
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            int ch = s.charAt(i);
            String s4 = Integer.toHexString(ch);
            str = str + s4;
        }
        return str;
    }

    /**
     * 十六进制字符串转换为字符串
     * @param s
     * @return
     */
    public static String hexStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++) {
            try {
                baKeyword[i] = (byte) (0xff & Integer.parseInt(
                        s.substring(i * 2, i * 2 + 2), 16));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "gbk");
//            new String();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    /**
     * 字符串转换为E码字符串
     * @param s
     * @return
     */
    public static String stringToEbcdicString(String s) throws Exception{
        byte[] bytes = s.getBytes("Cp1047");
        StringBuilder result = new StringBuilder();
        for (byte aByte : bytes) {
            int decimal = (int) aByte & 0xff;               // bytes widen to int, need mask, prevent sign extension
            // get last 8 bits
            String hex = Integer.toHexString(decimal);
            if (hex.length() % 2 == 1) {                    // if half hex, pad with zero, e.g \t
                hex = "0" + hex;
            }
            result.append(hex);
        }
        return result.toString().toUpperCase();

    }

    /**
     * E码字符串转换为字符串
     * @param s
     * @return
     */
    public static String ebcdicStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++) {
            try {
                baKeyword[i] = (byte) (0xff & Integer.parseInt(
                        s.substring(i * 2, i * 2 + 2), 16));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "Cp1047");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    /**
     * 二进制转字符串转十六进制字符串
     * @param input
     * @return
     */
    public static String bin2hex(String input) {
        StringBuilder sb = new StringBuilder();
        int len = input.length();
        System.out.println("原数据长度:" + (len / 8) + "字节");

        for (int i = 0; i < len / 4; i++){
            //每4个二进制位转换为1个十六进制位
            String temp = input.substring(i * 4, (i + 1) * 4);
            int tempInt = Integer.parseInt(temp, 2);
            String tempHex = Integer.toHexString(tempInt).toUpperCase();
            sb.append(tempHex);
        }

        return sb.toString();
    }

    /**
     * 十六进制字符串转二进制转字符串
     * @param input
     * @return
     */
    public static String hex2bin(String input) {
        StringBuilder sb = new StringBuilder();
        int len = input.length();
//        System.out.println("原数据长度:" + (len / 2) + "字节");

        for (int i = 0; i < len; i++){
            //每1个十六进制位转换为4个二进制位
            String temp = input.substring(i, i + 1);
            int tempInt = Integer.parseInt(temp, 16);
            String tempBin = Integer.toBinaryString(tempInt);
            //如果二进制数不足4位,补0
            if (tempBin.length() < 4){
                int num = 4 - tempBin.length();
                for (int j = 0; j < num; j++){
                    sb.append("0");
                }
            }
            sb.append(tempBin);
        }

        return sb.toString();
    }

    /**
     * bcd字符串(双数)转成字节码
     * bcd2hex跟decodeHexString结果一样
     * @param input 16进制字符串  如 9F33
     * @return
     */
    public static byte[] bcd2hex(String input){
        if(input==null || input.length()==0){
            return new byte[]{};
        }
        byte[] bs = new byte[input.length()/2];
        for(int i=0 ;i<input.length();i++){
            int x = Integer.parseInt(input.substring(i,i+2),16);
            bs[i/2] = (byte)x;
            i++ ;
        }
        return bs ;
    }

    /**
     * 字节码转成bcd字符串
     * @param input
     * @return
     */
    public static String hex2bcd(byte[] input){
        StringBuilder builder = new StringBuilder();
        if(input!=null && input.length!=0){
            for(int i=0 ;i<input.length;i++){
                int v = input[i] & 0xFF ;
                String hv = Integer.toHexString(v);
                if(hv.length()<2){
                    builder.append(0);
                }
                builder.append(hv.toUpperCase());
            }
        }
        return builder.toString();
    }

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

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

相关文章

select for update加了行锁还是表锁?

最近在开发需求的时候&#xff0c;用到了select......for update。在代码评审的时候&#xff0c;一位同事说 &#xff0c;唯一索引一个非索引字段&#xff0c;是否可能会锁全表呢&#xff1f;本文将通过9个实验操作的例子&#xff0c;给大家验证select......for update到底加了…

迁移环境时,忘记私钥证书密码怎么办?

知行之桥的版本在进行不断更新&#xff0c;相较之前的版本而言&#xff0c;知行之桥每一次更新的版本&#xff0c;无论在操作还是功能亦或是便利性上都有更好的优势&#xff0c;因此不少企业会在新版本更新之后果断选择新的版本&#xff0c;企业选择版本更新之后&#xff0c;需…

He3 新版上新

系统功能更新 支持拖动工具&#xff0c;调整位置 支持置顶 支持自定义分类 新增工具 Paseto 生成器 2. 文本分析 JSON 转 PHP&#xff0c;YAML 转 PHP UTF7 编码、UTF7 解码 6. UTM 生成器 CSS 边框圆角生成器 CSV 类转换工具&#xff0c;目前支持 CSV 与 Markdown、HTML、JS…

什么是无代码ITSM工具

拥有强大 ITSM 团队的企业已经能够生存下来&#xff0c;并且在某些情况下在整个大流行期间表现出色。成功的 IT 团队以其在日常运营中断时快速恢复的能力而闻名。 当您需要重新组织服务交付流程时&#xff0c;ITSM 平台可以减少工程工作量&#xff0c;这对于制定弹性 ITSM 战略…

Python学习笔记——元组

Python将不能修改的值称为不可变的&#xff0c;而不可变的列表被称为元组。定义元组元组创建只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。元组使用小括号 ( )&#xff0c;列表使用方括号 [ ]。定义元组后&#xff0c;就可以使用索引来访问其元素&#xff0c;就像访…

ansible作业二

ansible匹配自定义路径清单文件 查看当前匹配的清单文件路径 [rootserver ~]# ansible --version ansible [core 2.13.5]config file /etc/ansible/ansible.cfg --- 默认配置文件configured module search path [/root/.ansible/plugins/modules, /usr/share/ansible/plugin…

力扣(LeetCode)1150. 检查一个数是否在数组中占绝大多数(C++/Python3)

遍历 直观思考&#xff0c;一次遍历数组&#xff0c;计数 target 。用 target 出现次数和数组长度的一半做比较&#xff0c;即可得到答案。 class Solution { public:bool isMajorityElement(vector<int>& nums, int target) {int cnt 0;for(auto &x:nums)if(…

7、Servlet——Servlet核心接口和类、创建Servlet的三种方式

目录 一、Servlet核心接口和类 1、Servlet接口 2、GenericServlet抽象类 3、HttpServlet类 二、创建Servlet的三种方式 1、实现Servlet接口 2、继承GenericServlet抽象类 3、继承HttpServlet类 三、web.xml中其他配置 1、启动优先级&#xff1a; 2、url-pattern定…

【SpringCloud02】订单-支付微服务模块(支付模块构建)

1.微服务cloud整体聚合父工程Project New Project 聚合总父工程名字 Maven选版本 工程名字 字符编码 注解生效激活 Java编译版本选8 File Type过滤 2.父工程POM 2.1Pom.xml文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi&quo…

docker中MySQL忘记登录密码找回方法

查看docker启动列表 docker ps 进入启动的mysql容器中 docker exec -it mysql /bin/bash 修改mysql配置文件 vim /etc/mysql/conf.d/docker.cnf 在最后添加 skip-grant-tables 如果出现命令没找到&#xff0c;则需要安装。 依次使用以下命令安装vim apt-get update apt…

java 系列文章之异常

文章目录一、概念二、异常分类1. Error2. Exception三、异常的处理方式四、Throw 和 throws 的区别1. 位置不同2. 功能不同总结一、概念 果某个方法不能按照正常的途径完成任务&#xff0c;就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时&a…

关于单行处理函数——ifnull()

我们先来看一个实例&#xff1a; 需求&#xff1a;在员工表emp中查看员工的年薪 分析&#xff1a;计算年薪除了月薪外补助也应该计算在内&#xff0c;所以年薪 (月薪 补助) * 12 sql语句&#xff1a;select ename,(sal comm) *12 as 年薪 from emp; …

SpringBoot+Vue项目在线拍卖系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

编译原理分析器大作业之字幕分析器

写这篇文章的主要目的呢是分享一下编译原理大作业——电影字幕分析器&#xff0c;分享一下我的做法&#xff0c;可能采用的做法不是特别好的用法&#xff0c;希望各位多多指点&#xff0c;觉得文章不错给点小赞赞喔!!! 题目介绍 写一个srt字幕解释器&#xff0c;需要分析单词…

动手深度学习-线性神经网络:线性回归

目录线性模型&#xff08;1&#xff09;度量模型质量-损失函数&#xff08;2&#xff09;更新模型以提高模型预测质量-随机梯度下降线性回归的从零开始实现线性回归的简洁实现参考教程&#xff1a;https://courses.d2l.ai/zh-v2/线性模型 定义&#xff1a;回归&#xff08;reg…

FFmpeg音频重采样API(libswresample)

目录 参考 lswr功能介绍 lswr使用说明 示例代码 \1. 参考 [1] FFmpeg/Libswresample Documentation [2] FFmpeg/Libswresample Detailed Description [3] FFmpeg/doc/examples/resampling_audio.c \2. lswr功能介绍 FFmpeg中重采样的功能由libswresample(后面简写为lswr…

代码随想录训练营第五十七天

1.回文子串 题647 ①dp数组含义 判断回文子串可以用头元素和尾元素是否相等的方式&#xff0c;设dp[i] [j]为[i,j]子串是否为回文子串&#xff0c;是则为true&#xff0c;否为false。 ②递推公式 若 s[i] s[j] &#xff0c;分三种情况&#xff1a;i j&#xff0c;即只有一…

Leetcode数组专题专练:经典题目+思路解读

文章目录 系列&#xff1a;数组专练 语言&#xff1a;java & go 题目来源&#xff1a;Leetcode 常考点&#xff1a; 二分 & 双指针 & 滑动窗口 & 模拟行为 思路和参考答案文章目录数组专题总结二分法专练双指针专练滑动窗口专练模拟行为专练题目描述数组专题总…

cnn平移等变性和不变性

通俗说法: 等变性&#xff08;Equivariance&#xff09;&#xff1a;对一个输入施加某种变换后所产生的结果同样反应在输出上&#xff0c;说明该变换具有等变性。寻找一个从输入图像到输出类别的映射&#xff0c;这个映射对目标的几何变换(如平移&#xff0c;旋转&#xff0c;…

linux系统中如何使用QT来进行网络编程实现

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何使用QT进行网络编程与实现。 目录 第一&#xff1a;网络编程基本简介 第二&#xff1a;TCP通信简介 第三&#xff1a;TCP服务器端代码具体实现 第四&#xff1a;源文件mainwindow.cpp的具体实现 第一&#xff1a;…