在Java中字节与十六进制的相互转换主要思想有两点:

1、二进制字节转十六进制时,将字节高位与0xF0做"&"操作,然后再左移4位,得到字节高位的十六进制A;将字节低位与0x0F做"&"操作,得到低位的十六进制B,将两个十六进制数拼装到一块AB就是该字节的十六进制表示。
2、十六进制转二进制字节时,将十六进制字符对应的十进制数字右移动4为,得到字节高位A;将字节低位的十六进制字符对应的十进制数字B与A做"|"运算,即可得到十六进制的二进制字节表示

我测试的Java代码如下:

  1. public class Test01 {
  2. private static String hexStr =  "0123456789ABCDEF";
  3. private static String[] binaryArray =
  4. {"0000","0001","0010","0011",
  5. "0100","0101","0110","0111",
  6. "1000","1001","1010","1011",
  7. "1100","1101","1110","1111"};
  8. public static void main(String[] args)
  9. {
  10. String str = "二进制与十六进制互转测试";
  11. System.out.println("源字符串:\n"+str);
  12. String hexString = BinaryToHexString(str.getBytes());
  13. System.out.println("转换为十六进制:\n"+hexString);
  14. System.out.println("转换为二进制:\n"+bytes2BinaryStr(str.getBytes()));
  15. byte [] bArray = HexStringToBinary(hexString);
  16. System.out.println("将str的十六进制文件转换为二进制再转为String:\n"+new String(bArray));
  17. }
  18. /**
  19. *
  20. * @param str
  21. * @return 转换为二进制字符串
  22. */
  23. public static String bytes2BinaryStr(byte[] bArray){
  24. String outStr = "";
  25. int pos = 0;
  26. for(byte b:bArray){
  27. //高四位
  28. pos = (b&0xF0)>>4;
  29. outStr+=binaryArray[pos];
  30. //低四位
  31. pos=b&0x0F;
  32. outStr+=binaryArray[pos];
  33. }
  34. return outStr;
  35. }
  36. /**
  37. *
  38. * @param bytes
  39. * @return 将二进制转换为十六进制字符输出
  40. */
  41. public static String BinaryToHexString(byte[] bytes){
  42. String result = "";
  43. String hex = "";
  44. for(int i=0;i<bytes.length;i++){
  45. //字节高4位
  46. hex = String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4));
  47. //字节低4位
  48. hex += String.valueOf(hexStr.charAt(bytes[i]&0x0F));
  49. result +=hex+" ";
  50. }
  51. return result;
  52. }
  53. /**
  54. *
  55. * @param hexString
  56. * @return 将十六进制转换为字节数组
  57. */
  58. public static byte[] HexStringToBinary(String hexString){
  59. //hexString的长度对2取整,作为bytes的长度
  60. int len = hexString.length()/2;
  61. byte[] bytes = new byte[len];
  62. byte high = 0;//字节高四位
  63. byte low = 0;//字节低四位
  64. for(int i=0;i<len;i++){
  65. //右移四位得到高位
  66. high = (byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4);
  67. low = (byte)hexStr.indexOf(hexString.charAt(2*i+1));
  68. bytes[i] = (byte) (high|low);//高地位做或运算
  69. }
  70. return bytes;
  71. }
  72. }
 

运行后的输出结果如下:

源字符串:

二进制与十六进制互转测试

转换为十六进制:

E4BA8CE8BF9BE588B6E4B88EE58D81E585ADE8BF9BE588B6E4BA92E8BDACE6B58BE8AF95

转换为二进制:

11100100  10111010  10001100  11101000  10111111  10011011  11100101
 10001000  10110110 11100100  10111000  10001110  11100101  10001101
 10000001  11100101  10000101  10101101 11101000  10111111  10011011
 11100101  10001000  10110110  11100100  10111010  10010010 11101000
 10111101  10101100  11100110  10110101  10001011  11101000  10101111
 10010101

将str的十六进制文件转换为二进制并转为String:

二进制与十六进制互转测试

Java中二进制字节与十六进制互转的更多相关文章

  1. c#与java中byte字节的区别及转换方法

    原文:c#与java中byte字节的区别及转换方法 在java中  byte的范围在 [-128,127] 在C#中  byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时 ...

  2. Java中的字节输入出流和字符输入输出流

    Java中的字节输入出流和字符输入输出流 以下哪个流类属于面向字符的输入流( ) A BufferedWriter B FileInputStream C ObjectInputStream D In ...

  3. Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

    public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...

  4. Java中的字节,字符与编码,解码

    ASCII编码 ASCII码主要是为了表示英文字符而设计的,ASCII码一共规定了128个字符的编码(0x00-0x7F),只占用了一个字节的后面7位,最前面的1位统一规定为0. ISO-8859-1 ...

  5. 弄清java中的字节与字符

    问题 在java中,一个字符等于多少字节? 或者更详细的问:在java中,一个英文字符等于多少字节?一个中文字符等于多少字节? 答案 Java采用unicode来表示字符,java中的一个char是2 ...

  6. Java中根据字节截取字符串

    一.简介 为了统一世界各国的字符集,流行开了Unicode字符集,java也支持Unicode编码,即java中char存的是代码点值,即无论是‘A’还是‘中’都占两个字节. 代码点值:与Unicod ...

  7. java中 二进制 八进制 十六进制 十进制 相互转换 最简方法

    package com.swift; import java.util.Scanner; public class Hex2Decimal { public static void main(Stri ...

  8. 【转】java中float与byte[]的互转 -- 不错

    原文网址:http://tjmljw.iteye.com/blog/1767716 起因:想把一个float[]转换成内存数据,查了一下,下面两个方法可以将float转成byte[]. 方法一 imp ...

  9. 在Java中按字节获得字符串长度的三种方法

    转载:http://www.blogjava.net/nokiaguy/archive/2010/04/11/317982.html 由于Java是基于Unicode编码的,因此,一个汉字的长度为1, ...

随机推荐

  1. [原创]Linux 下 redis 链接一次

    刚接触 Linux ,在 Linux 下安装 redis 链接redis 出现了以下问题  Could not connect to Redis at 127.0.0.1:6379: Connecti ...

  2. Laravel修炼:服务容器绑定与解析

    前言   老实说,第一次老大让我看laravel框架手册的那天早上,我是很绝望的,因为真的没接触过,对我这种渣渣来说,laravel的入门门槛确实有点高了,但还是得硬着头皮看下去(虽然到现在我还有很多 ...

  3. Myeclipse学习总结(7)——Eclipse插件之Maven配置及问题解析

    前言: 今天在自己环境装了Maven环境, 并且安装了Eclipse插件, 在查找插件过程中确实遇到一些问题, 好不容易找到一个  却又有问题. 装好了插件之后, 用Eclipse创建Maven项目却 ...

  4. hibernate ID生成策略配置

    1.Student.hbm.xml配置 <hibernate-mapping package="com.wxh.hibernate.model"> <class ...

  5. Invalid project description.

    1.错误描写叙述 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/ ...

  6. Android Camera+SurfaceView实现自己定义拍照

    对Activity强制横屏,保证预览方向正确. 使用OrientationEventListener监听设备方向.推断竖拍时,旋转照片后再保存.保证竖拍时预览图片和保存后的图片方向一致. 执行效果: ...

  7. iOS开发-sqlite3使用

    SQLite3使用 SQLite简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. SQLite3 在XCode工程中,打开targets,在B ...

  8. [poj 2773] Happy 2006 解题报告 (二分答案+容斥原理)

    题目链接:http://poj.org/problem?id=2773 题目大意: 给出两个数m,k,要求求出从1开始与m互质的第k个数 题解: #include<algorithm> # ...

  9. Frame Stacking ZOJ 1083,poj 1128

    Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4034   Accepted: 1352 De ...

  10. BZOJ 2049 LCT

    思路:LCT的基本操作 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...