java 转byte字符串,Java 字符串与byte之间的相互转换
写在前面
上次在简书上第一次发表文章多了30位朋友关注和收到80多个喜欢让我受宠若惊。我当时打算以后要多写一些有价值的文章,才对得起关注我的朋友。然而,爱游戏的我在刚不久前把四公主接回来了~这一个多月都沉迷于游戏世界... 游戏世界也同样精彩,但现实的世界更精彩~今天就先写一个简单的东西,让我先找回状态。
哦!对了,如果ps4玩家有兴趣的话,可以私信我或者在下面评论,加个好友,有空的话一起玩玩游戏,虽然我是单机游戏爱好者~
正文
你是否跟我一样,在一些需要加密的代码里看见需要把字符串转换为字节的场景,例如MD5加密。而你每次看到像我以前一样,自动地略过(反正别人都写好了,我用就是了)。如果是的话,不要再逃避了,下面跟我一起来了解一下字符串与byte之间转换的原理
原理
我们都知道,在Java里byte类型是占用1个字节,即8位的,而16进制的字符占用4位,所以每个byte可以用两个字符来表示,反之亦然。
举个栗子
byte = 123
用二进制表示:0111 1011
每4位用字符表示: 7 b
注意:java是用补码来进行二进制计算的,因为上面最高位为0,即为正数,而正数的补码为自身,所以没什么问题,下面看看负数的栗子:
16位进制字符串表示: a b
用二进制表示:1010 1011
二进制补码: 1101 0101
byte:-85 (如果不用补码计算,应该为171,超出byte的范围了)
是的,原理就这么简单,接下来用代码实现:
byte[] 转16进制字符串
法1
思路:先把byte[] 转换维char[],再把char[] 转换为字符串
public static String bytes2Hex(byte[] src) {
if (src == null || src.length <= 0) {
return null;
}
char[] res = new char[src.length * 2]; // 每个byte对应两个字符
final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
for (int i = 0, j = 0; i < src.length; i++) {
res[j++] = hexDigits[src[i] >> 4 & 0x0f]; // 先存byte的高4位
res[j++] = hexDigits[src[i] & 0x0f]; // 再存byte的低4位
}
return new String(res);
}
法2
思路:先把byte转换为int类型,再转换为字符串
public static String bytes2Hex(byte[] src){
if (src == null || src.length <= 0) {
return null;
}
StringBuilder stringBuilder = new StringBuilder("");
for (int i = 0; i < src.length; i++) {
// 之所以用byte和0xff相与,是因为int是32位,与0xff相与后就舍弃前面的24位,只保留后8位
String str = Integer.toHexString(src[i] & 0xff);
if (str.length() < 2) { // 不足两位要补0
stringBuilder.append(0);
}
stringBuilder.append(str);
}
return stringBuilder.toString();
}
16进制字符串转byte[]
思路:先把字符串转换为char[],再转换为byte[]。
因为两个字符对应一个byte,所以字符串的长度不能为奇数喔(哪位有想到好办法解决这一问题的,求告知)。
public static byte[] hex2Bytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] bytes = new byte[length];
String hexDigits = "0123456789abcdef";
for (int i = 0; i < length; i++) {
int pos = i * 2; // 两个字符对应一个byte
int h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1
int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2
if(h == -1 || l == -1) { // 非16进制字符
return null;
}
bytes[i] = (byte) (h | l);
}
return bytes;
}
注:注1得到xxxx0000,注2得到0000xxxx,相或就把两个字符转换为一个byte了。
再举个栗子
md5加密
public static String getMd5ByFile(File file) {
String ret= null;
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int len;
while((len = fis.read(buffer)) > 0) {
md.update(buffer, 0, len);
}
ret = bytes2Hex(md.digest()); // 把md5加密后的byte[]转换为字符串
} catch (Exception e) {
e.printStackTrace();
} finally {
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return ret;
}
写在最后
好了,应该懂了吧,其实并不难的。上面的是我个人的理解,难免有错。若有错,欢迎指正。
如果这篇文章对你有帮助的话,不妨点个喜欢呗~
java 转byte字符串,Java 字符串与byte之间的相互转换相关推荐
- Java中List和数组Array和String之间的相互转换
Java中List和数组Array和String之间的相互转换 之前面试的时候遇到一个问题,先给大家分享一下.问:我想分别得到list,string和数组的长度,我能通过什么代码来得到? 这个问题先留 ...
- Java实现 String类型的ip与整数之间的相互转换(2021.8.1百度提前批面试题)
题目: 实现 String 类型的 ip 与整数之间的相互转化.例如:将 "192.168.0.1" 转换为整数,然后给定这个整数仍然可以得到这个 String 类型的 ip. / ...
- ip地址转换数字函数 iton_IP地址的字符串形式和数字形式之间的相互转换函数
最近要用到网络编程的东西,差一点自己去山寨已有的函数.基础不好,不知道已有函数可以满足需要,呵呵. 这个示例程序说的是ip地址的数字形式和字符串形式之间的相互转换. 从字符串形式转换到数字形式: in ...
- python 中list(列表),tupe(元组),str(字符串),dict(字典)之间的相互转换
1.字典(dict) dict = {'name': 'Zara', 'age': 7, 'class': 'First'} 1.1 字典--字符串 返回: print type(str(dict)) ...
- java 打印对象属性 工具类_关于java实现任意对象输出字符串的工具类ObjectUtils用户打印日志、接口调试及监控等...
通过该对象工具类ObjectUtils(参考org.springframework.util.ObjectUtils)实现了类集.数组及基本数据类型转换及字符串输出,常用在日志输出打印.接口联调及对象 ...
- java安全编码指南之:字符串和编码
文章目录 简介 使用变长编码的不完全字符来创建字符串 char不能表示所有的Unicode 注意Locale的使用 文件读写中的编码格式 不要将非字符数据编码为字符串 简介 字符串是我们日常编码过程中 ...
- Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutputStream用法)
Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...
- Java字节序,java整型数与网络字节序 byte[] 数组转换关系
Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...
- java无符号 uuid,java实现无符号数转换、字符串补齐、md5、uuid、随机数示例
package com.hongyuan.test; import java.security.messagedigest; import java.security.nosuchalgorithme ...
最新文章
- oracle中treat函数,Oracle 函数概览
- MongoDB数据库(4.mongodb数据库的备份和恢复)
- 不要错过路边的的风景
- background-position 用法介绍
- 2 环境设置_VS Code 虚拟环境设置
- 谈谈Winform程序的界面设计
- pandas隔行计算均值方差(相邻行或隔行的均值/方差)
- jQuery验证框架(五)验证器
- linux运维视频教程
- [2018.10.23 T2] 行星通道计划
- 方便好用的论文管理软件EndNote X9 + PDF阅读编辑器Adobe Acrobat DC(2)
- 2022年10月29日(星期六)骑行海囗林场森林公园
- 一些名人语录(不断添加中...)
- 2021-2027全球与中国11-氨基十一烷市场深度研究分析报告
- not within a switch statement_【实用教程】Switch无法登录关联任天堂账号怎么办
- 《 Python List列表全实例详解系列(三)》——列表添加元素(4种方法)
- 只说董超正在家里拴 3gp转换软件
- 从源码角度分析Android中的Binder机制的前因后果
- 海康设备云平台简单控制
- docker启动ssh、xrdp命令