java字节、位移以及进制转换
数据存储方式
众所周知,java中的数据都是以二进制的形式存储在计算机中的,但是我们看到的数据怎么是10进制的,因为java提供了很多进制自动转换的方式。
位移
向左位移是*2的幂次,一般都是正数操作,右侧补0,所以不存在有符号左位移
向右位移会存在负数,所以存在有符号和无符号右移的问题,左侧补0.
public class Binary {
public static void main(String[] args) {
//转换成2进制,用Integer.toBinaryString()
//转换成16进制,用Integer.toHexString()
int i = 89;
System.out.println(Integer.toBinaryString(i));
//parseInt()
int a = Integer.parseInt("232");
System.out.println(a);
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toHexString(a));
/**
* ~: 0-->1 1-->0
* 注意:00000001 ---> 11111110
*/
System.out.println(~a);
System.out.println(Integer.toHexString(~a));
int n;
int m;
/**
* | 或
*
* 0 | 0 = 0
* 0 | 1 = 1
* 1 | 0 = 1
* 1 | 1 = 0
*
* 常用于数据的拼接
*/
// n = 00000000 00000000 00000000 10100010
// m = 00000000 00000000 10111000 00000000
// i = 00000000 00000000 10111000 10100010
n = 0xa2;
m = 0xb800;
i = n | m; // 0xb8a2;
System.out.println(Integer.toHexString(i));
/**
* & 与
*
* 0 & 0 = 0
* 0 & 1 = 0
* 1 & 0 = 0
* 1 & 1 = 1
*
* 常用语拆分截取数据
*
* n = 00000000 00000000 00110100 10110101
* m = 00000000 00000000 00000000 11111111
* i = 00000000 00000000 00000000 10110101
*/
n = 0x34b5;
m = 0xff;
i = n & m; //0xb5;
System.out.println(Integer.toHexString(i));
/**
* >>> 逻辑右移
* n = 01010001 11000000 00000010 01011111
* n>>>1 = 001010001 11000000 00000010 0101111 1(右移后去掉,高位补0)
*
* n = 10100000 10110101 00101100 00100010
* c1 = 11111111 00000000 00000000 00000000
* c2 = 00000000 11111111 00000000 00000000
* c3 = 00000000 00000000 11111111 00000000
* c4 = 00000000 00000000 00000000 11111111
*/
int b1,b2,b3,b4;
n = 0xa0b52c22;
//截取
//拆分成byte
b1 = (n>>24) & 0xff;
b2 = (n>>16) & 0xff;
b3 = (n>>8) & 0xff;
b4 = n & 0xff;
System.out.println(Integer.toHexString(b1));
System.out.println(Integer.toHexString(b2));
System.out.println(Integer.toHexString(b3));
System.out.println(Integer.toHexString(b4));
//拼接
//byte组合成int
n = b4 | (b3<<8) | (b2<<16) | (b1<<24);
System.out.println(Integer.toHexString(n));
/**
* >>:正数的时候高位为0 >>补0
* 负数的时候高位为1 >>补1
* 以0开头的肯定是正数,以1开头的肯定是负数
*/
/**
* <<:左移
* 10进制中移动一位相当于源数据*10
* 2进制中移动一位相当于源数据*2
* 2<<1 = 2*2
* 2<<2 = 2*4 = 2*(2*2)
* 2<<3 = 2*8 = 2*(2*2*2)
* 20<<1 = 20*2
* 20<<2 = 20*4 = 20*(2*2)
*
* 位移n,相当于2的n次幂
*/
System.out.println(2<<3); //2*2*2*2=16
System.out.println(50<<4); //50*2*2*2*2=800
}
}
进制转换
- 字节转10进制
直接使用(int)类型转换。
/*
* 字节转10进制
*/
public static int byte2Int(byte b){
int r = (int) b;
return r;
}
- 10进制转字节
直接使用(byte)类型转换。
/*
* 10进制转字节
*/
public static byte int2Byte(int i){
byte r = (byte) i;
return r;
}
- 字节数组转16进制字符串
对每一个字节,先和0xFF做与运算,然后使用Integer.toHexString()函数,如果结果只有1位,需要在前面加0
/*
* 字节数组转16进制字符串
*/
public static String bytes2HexString(byte[] b) {
String r = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
r += hex.toUpperCase();
}
return r;
}
- 16进制字符串转字节数组
这个比较复杂,每一个16进制字符是4bit,一个字节是8bit,所以两个16进制字符转换成1个字节,对于第1个字符,转换成byte以后左移4位,然后和第2个字符的byte做或运算,这样就把两个字符转换为1个字节。
/*
* 字符转换为字节
*/
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
/*
* 16进制字符串转字节数组
*/
public static byte[] hexString2Bytes(String hex) {
if ((hex == null) || (hex.equals(""))){
return null;
}
else if (hex.length()%2 != 0){
return null;
}
else{
hex = hex.toUpperCase();
int len = hex.length()/2;
byte[] b = new byte[len];
char[] hc = hex.toCharArray();
for (int i=0; i<len; i++){
int p=2*i;
b[i] = (byte) (charToByte(hc[p]) << 4 | charToByte(hc[p+1]));
}
return b;
}
}
- 字节数组转字符串
直接使用new String()
/*
* 字节数组转字符串
*/
public static String bytes2String(byte[] b) throws Exception {
String r = new String (b,"UTF-8");
return r;
}
- 字符串转字节数组
直接使用getBytes()。
/*
* 字符串转字节数组
*/
public static byte[] string2Bytes(String s){
byte[] r = s.getBytes();
return r;
}
- 16进制字符串转字符串
先转换成byte[],再转换成字符串。
/*
* 16进制字符串转字符串
*/
public static String hex2String(String hex) throws Exception{
String r = bytes2String(hexString2Bytes(hex));
return r;
}
- 字符串转16进制字符串
先转换为byte[],再转换为16进制字符串。
/*
* 字符串转16进制字符串
*/
public static String string2HexString(String s) throws Exception{
String r = bytes2HexString(string2Bytes(s));
return r;
}
main函数:
public static void main(String[] args) throws Exception{
byte b1 = (byte) 45;
System.out.println("1.字节转10进制:" + byte2Int(b1));
int i = 89;
System.out.println("2.10进制转字节:" + int2Byte(i));
byte[] b2 = new byte[]{(byte)0xFF, (byte)0x5F, (byte)0x6, (byte)0x5A};
System.out.println("3.字节数组转16进制字符串:" + bytes2HexString(b2));
String s1 = new String("1DA47C");
System.out.println("4.16进制字符串转字节数组:" + Arrays.toString(hexString2Bytes(s1)));
System.out.println("5.字节数组转字符串:" + bytes2String(b2));
System.out.println("6.字符串转字节数组:" + Arrays.toString(string2Bytes(s1)));
System.out.println("7.16进制字符串转字符串:" + hex2String(s1));
String s2 = new String("Hello!");
System.out.println("8.字符串转16进制字符串:" + string2HexString(s2));
}
运行结果:
字节转10进制:45
.10进制转字节:89
.字节数组转16进制字符串:FF5F065A
.16进制字符串转字节数组:[29, -92, 124]
.字节数组转字符串:?_Z
.字符串转字节数组:[49, 68, 65, 52, 55, 67]
.16进制字符串转字符串:?|
.字符串转16进制字符串:48656C6C6F21
java字节、位移以及进制转换的更多相关文章
- HexDump.java解析,android 16进制转换
HexDump.java解析android 16进制转换 package com.android.internal.util; public class HexDump { private final ...
- java中Integer包装类的具体解说(java二进制操作,全部进制转换)
程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...
- Java语言发展史-计算机进制转换
Java语言发展史 java的诞生 在1991年时候,James Gosling在Sun公司的工程师小组想要设计这样一种主要用于像电视盒这样的消费类电子产品的小型计算机语言. 这些电子产品有一个共同的 ...
- 【搬砖】安卓入门(2)- Java开发编程基础--进制转换和运算符
02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 ...
- java中常用的进制转换
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integ ...
- IT兄弟连 Java语法教程 数据类型 进制转换
● 正十进制转换为二进制 拆分法,将十进制整数拆分为若干个二进制权重的和,若有该权重则下面写1,否则写0.如: 34 = 32 + 2 128 64 32 16 8 4 2 1 0 0 1 0 ...
- 【Java】7.0 进制转换
[二进制转十进制] public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.p ...
- 【九度OJ】题目1138:进制转换 解题报告
[九度OJ]题目1138:进制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1138 题目描述: 将一个长度最多为30 ...
- 最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类
前言:用于处理Java基本数据的转换及进制转换操作工具 一.实现功能 1.int与byte互转 2.int与byte[]互转 3.short与byte互转 4.short与byte[]互转 5.16位 ...
- java se系列(二) 关键字、注释、常量、进制转换、变量、数据类型转换、运算符
1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 1.2 常见的关键字 备注 ...
随机推荐
- [转帖]「更易用的OceanBase」|OceanBase 4.0 一体化安装包 - 把简单留给用户
https://www.modb.pro/db/565842 1. OceanBase 3.x 版本安装浅谈 我是在 OceanBase 3.1.4 版本的时候开始尝试入手测试的.刚开始 OB 3.x ...
- [转帖]QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考
https://baijiahao.baidu.com/s?id=1675704570461446033&wfr=spider&for=pc 吞吐量 在了解qps.tps.rt.并发数 ...
- @Transaction注解的失效场景
作者:京东物流 孔祥东 背景 事情是这样,最近在实现一个需求的时候,有一个定时异步任务会捞取主表的数据并置为处理中(为了防止任务执行时间过长,下次任务执行把本次数据重复捞取),然后根据主表关联明细表数 ...
- css3只需一招,将网站变成灰色的
今天大家在浏览B站,腾讯视频,等网站时,有没有发现一个现象,网站变成灰色的了. 是不是跟平常不一样了呢,这是因为今天(2020.4.4)是全国哀悼日, 所以网站这些就变成灰色的呢. 我去看了一下腾讯的 ...
- Leetcode 42题 接雨水(Trapping Rain Water) Java语言求解
题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目内容 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱 ...
- 4.4 Windows驱动开发:内核监控进程与线程创建
当你需要在Windows操作系统中监控进程的启动和退出时,可以使用PsSetCreateProcessNotifyRoutineEx函数来创建一个MyCreateProcessNotifyEx回调函数 ...
- PostFix+Dovecot 部署邮件系统
Postfix 是一种电子邮件服务器是一个开放源代码的软件. Postfix 是MTA邮件传输代理软件.是sendmail提供替代品的一个尝试,在Internet世界中,大部分的电子邮件都是通过sen ...
- C# WinForm 界面控件
C# WinForm是一种GUI应用程序框架,它允许开发人员使用各种控件来创建丰富的用户界面.以下是一些C# WinForm中常见的界面控件:这些界面控件在C# WinForm应用程序开发中非常常见, ...
- C# 中的函数与方法
在C#中,函数和方法都是一段可重用的代码块,用于实现特定的功能.函数是C#中的基本代码块之一,用于完成特定的任务和返回一个值.函数可以具有零个或多个参数,并且可以使用关键字来指定函数的访问级别和返回类 ...
- LyScriptTools 反汇编类API接口手册
LyScriptTools模块实在LyScript模块反汇编基础上封装而成,其提供了更多的反汇编方法,可以更好的控制x64dbg完成自动化反汇编任务,API参考手册如下. 插件地址:https://g ...