写在前面

上次在简书上第一次发表文章多了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之间的相互转换相关推荐

  1. Java中List和数组Array和String之间的相互转换

    Java中List和数组Array和String之间的相互转换 之前面试的时候遇到一个问题,先给大家分享一下.问:我想分别得到list,string和数组的长度,我能通过什么代码来得到? 这个问题先留 ...

  2. Java实现 String类型的ip与整数之间的相互转换(2021.8.1百度提前批面试题)

    题目: 实现 String 类型的 ip 与整数之间的相互转化.例如:将 "192.168.0.1" 转换为整数,然后给定这个整数仍然可以得到这个 String 类型的 ip. / ...

  3. ip地址转换数字函数 iton_IP地址的字符串形式和数字形式之间的相互转换函数

    最近要用到网络编程的东西,差一点自己去山寨已有的函数.基础不好,不知道已有函数可以满足需要,呵呵. 这个示例程序说的是ip地址的数字形式和字符串形式之间的相互转换. 从字符串形式转换到数字形式: in ...

  4. python 中list(列表),tupe(元组),str(字符串),dict(字典)之间的相互转换

    1.字典(dict) dict = {'name': 'Zara', 'age': 7, 'class': 'First'} 1.1 字典--字符串 返回: print type(str(dict)) ...

  5. java 打印对象属性 工具类_关于java实现任意对象输出字符串的工具类ObjectUtils用户打印日志、接口调试及监控等...

    通过该对象工具类ObjectUtils(参考org.springframework.util.ObjectUtils)实现了类集.数组及基本数据类型转换及字符串输出,常用在日志输出打印.接口联调及对象 ...

  6. java安全编码指南之:字符串和编码

    文章目录 简介 使用变长编码的不完全字符来创建字符串 char不能表示所有的Unicode 注意Locale的使用 文件读写中的编码格式 不要将非字符数据编码为字符串 简介 字符串是我们日常编码过程中 ...

  7. Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutputStream用法)

    Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...

  8. Java字节序,java整型数与网络字节序 byte[] 数组转换关系

    Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...

  9. java无符号 uuid,java实现无符号数转换、字符串补齐、md5、uuid、随机数示例

    package com.hongyuan.test; import java.security.messagedigest; import java.security.nosuchalgorithme ...

最新文章

  1. oracle中treat函数,Oracle 函数概览
  2. MongoDB数据库(4.mongodb数据库的备份和恢复)
  3. 不要错过路边的的风景
  4. background-position 用法介绍
  5. 2 环境设置_VS Code 虚拟环境设置
  6. 谈谈Winform程序的界面设计
  7. pandas隔行计算均值方差(相邻行或隔行的均值/方差)
  8. jQuery验证框架(五)验证器
  9. linux运维视频教程
  10. [2018.10.23 T2] 行星通道计划
  11. 方便好用的论文管理软件EndNote X9 + PDF阅读编辑器Adobe Acrobat DC(2)
  12. 2022年10月29日(星期六)骑行海囗林场森林公园
  13. 一些名人语录(不断添加中...)
  14. 2021-2027全球与中国11-氨基十一烷市场深度研究分析报告
  15. not within a switch statement_【实用教程】Switch无法登录关联任天堂账号怎么办
  16. 《 Python List列表全实例详解系列(三)》——列表添加元素(4种方法)
  17. 只说董超正在家里拴 3gp转换软件
  18. 从源码角度分析Android中的Binder机制的前因后果
  19. 海康设备云平台简单控制
  20. docker启动ssh、xrdp命令

热门文章

  1. 小蔓的秋招计算机知识点急救方法
  2. UiPath自动化机器人有关版本问题解决和Robot连接到Orchestrator
  3. Shutdown自定义自动关机软件
  4. 计算机病毒发作的后果,计算机病毒和危害
  5. python scrapy 管道学习,并拿在行练手爬虫项目
  6. 简单五步设置群晖NAS绑定自有域名实现外网访问
  7. 如何选择语音短信通知平台?语音短信通知平台接入教程
  8. React-18--css in js
  9. 机器人相互教学让知识瞬间转移 AI迎来指数级进化 | 技术
  10. mysql关于case when的用法举例