在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. 整理 PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释:

    对你有助请点赞,请顶------送人玫瑰,手留余香! 1:58 2016/3/12 整理PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释: PHPsto ...

  2. JavaWeb学习笔记——访问静态HTML网页

    基础知识: 1.一个标准 的WEB应用,在根目录下必须有一个WEB-INF文件夹,文件夹下必须有一个WEB.xml文件. 2.classes文件夹用来存放编译的class文件. 3.lib文件夹用来存 ...

  3. JAVA类与对象(八)-----重写

    重写:子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即:外壳不变,核心重写! 好处:可以根据子类的需要,定义特定于自己的行为.也就是说子类能够根据需要实现父类的方法. cl ...

  4. PERCONA-TOOLKIT 工具的安装与使用2

    [root@server-mysql ~]# cd /usr/bin [root@server-mysql bin]# ls pt* pt-align pt-duplicate-key-checker ...

  5. C++并发编程学习笔记&amp;lt;1&amp;gt; 入门

    入门 多线程C++程序是什么样子的? 它看上去和其它全部C++程序一样,一般是变量.类以及函数的组合. 唯一真正的差别在于某些函数能够并发执行, 当然.为了并发地执行函数,必须使用特定的函数以及对象来 ...

  6. Git Batch命令(转)

    echo 和 @ 回显命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显.一般批处理第一行都是这个 echo on #从下一行开始打开回显 e ...

  7. 避免使用HttpClient的系统代理

    这两天在玩Consul, 他的.Net驱动使用了HttpClient来发送Http请求. 但是我的电脑上装有SS, 所以请求会被SS过滤一次, 然后导致请求的延迟一直比较高. 然后只需要改写一下Htt ...

  8. [APIO 2009] Atm

    传送门:>Here< 题意:给出一个有向图(有环),每个点有点权.从点S出发,经过每个点Tot可以加上点权,点可以经过多次,然而点权不能重复加多次.先要求走到某个终点E时点权最大.先要求在 ...

  9. linux的PAM认证和shadow文件中密码的加密方式

    它是一种统一的认证方案.PAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法.具体见 PAM 网站. 对于 PAM 您只需要做: 对您的密码采用不同于 DES ...

  10. FragmentPagerAdapter 与 FragmentStatePagerAdapter 的区别

    参考链接: http://blog.csdn.net/dreamzml/article/details/9951577 简单来说前者适合静态.少量的Fragment 后者适合动态.较多的Fragmen ...