`
xcy13638760
  • 浏览: 51494 次
社区版块
存档分类
最新评论

密码学2——Java byte数组与十六进制字符串互转

 
阅读更多

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示。

所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。

同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。

根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了。

Hex类代码如下:

Java代码收藏代码
  1. /**
  2. *referenceapachecommons<a
  3. *href="http://commons.apache.org/codec/">http://commons.apache.org/codec/</a>
  4. *
  5. *@authorAub
  6. *
  7. */
  8. publicclassHex{
  9. /**
  10. *用于建立十六进制字符的输出的小写字符数组
  11. */
  12. privatestaticfinalchar[]DIGITS_LOWER={'0','1','2','3','4','5',
  13. '6','7','8','9','a','b','c','d','e','f'};
  14. /**
  15. *用于建立十六进制字符的输出的大写字符数组
  16. */
  17. privatestaticfinalchar[]DIGITS_UPPER={'0','1','2','3','4','5',
  18. '6','7','8','9','A','B','C','D','E','F'};
  19. /**
  20. *将字节数组转换为十六进制字符数组
  21. *
  22. *@paramdata
  23. *byte[]
  24. *@return十六进制char[]
  25. */
  26. publicstaticchar[]encodeHex(byte[]data){
  27. returnencodeHex(data,true);
  28. }
  29. /**
  30. *将字节数组转换为十六进制字符数组
  31. *
  32. *@paramdata
  33. *byte[]
  34. *@paramtoLowerCase
  35. *<code>true</code>传换成小写格式,<code>false</code>传换成大写格式
  36. *@return十六进制char[]
  37. */
  38. publicstaticchar[]encodeHex(byte[]data,booleantoLowerCase){
  39. returnencodeHex(data,toLowerCase?DIGITS_LOWER:DIGITS_UPPER);
  40. }
  41. /**
  42. *将字节数组转换为十六进制字符数组
  43. *
  44. *@paramdata
  45. *byte[]
  46. *@paramtoDigits
  47. *用于控制输出的char[]
  48. *@return十六进制char[]
  49. */
  50. protectedstaticchar[]encodeHex(byte[]data,char[]toDigits){
  51. intl=data.length;
  52. char[]out=newchar[l<<1];
  53. //twocharactersformthehexvalue.
  54. for(inti=0,j=0;i<l;i++){
  55. out[j++]=toDigits[(0xF0&data[i])>>>4];
  56. out[j++]=toDigits[0x0F&data[i]];
  57. }
  58. returnout;
  59. }
  60. /**
  61. *将字节数组转换为十六进制字符串
  62. *
  63. *@paramdata
  64. *byte[]
  65. *@return十六进制String
  66. */
  67. publicstaticStringencodeHexStr(byte[]data){
  68. returnencodeHexStr(data,true);
  69. }
  70. /**
  71. *将字节数组转换为十六进制字符串
  72. *
  73. *@paramdata
  74. *byte[]
  75. *@paramtoLowerCase
  76. *<code>true</code>传换成小写格式,<code>false</code>传换成大写格式
  77. *@return十六进制String
  78. */
  79. publicstaticStringencodeHexStr(byte[]data,booleantoLowerCase){
  80. returnencodeHexStr(data,toLowerCase?DIGITS_LOWER:DIGITS_UPPER);
  81. }
  82. /**
  83. *将字节数组转换为十六进制字符串
  84. *
  85. *@paramdata
  86. *byte[]
  87. *@paramtoDigits
  88. *用于控制输出的char[]
  89. *@return十六进制String
  90. */
  91. protectedstaticStringencodeHexStr(byte[]data,char[]toDigits){
  92. returnnewString(encodeHex(data,toDigits));
  93. }
  94. /**
  95. *将十六进制字符数组转换为字节数组
  96. *
  97. *@paramdata
  98. *十六进制char[]
  99. *@returnbyte[]
  100. *@throwsRuntimeException
  101. *如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
  102. */
  103. publicstaticbyte[]decodeHex(char[]data){
  104. intlen=data.length;
  105. if((len&0x01)!=0){
  106. thrownewRuntimeException("Oddnumberofcharacters.");
  107. }
  108. byte[]out=newbyte[len>>1];
  109. //twocharactersformthehexvalue.
  110. for(inti=0,j=0;j<len;i++){
  111. intf=toDigit(data[j],j)<<4;
  112. j++;
  113. f=f|toDigit(data[j],j);
  114. j++;
  115. out[i]=(byte)(f&0xFF);
  116. }
  117. returnout;
  118. }
  119. /**
  120. *将十六进制字符转换成一个整数
  121. *
  122. *@paramch
  123. *十六进制char
  124. *@paramindex
  125. *十六进制字符在字符数组中的位置
  126. *@return一个整数
  127. *@throwsRuntimeException
  128. *当ch不是一个合法的十六进制字符时,抛出运行时异常
  129. */
  130. protectedstaticinttoDigit(charch,intindex){
  131. intdigit=Character.digit(ch,16);
  132. if(digit==-1){
  133. thrownewRuntimeException("Illegalhexadecimalcharacter"+ch
  134. +"atindex"+index);
  135. }
  136. returndigit;
  137. }
  138. publicstaticvoidmain(String[]args){
  139. StringsrcStr="待转换字符串";
  140. StringencodeStr=encodeHexStr(srcStr.getBytes());
  141. StringdecodeStr=newString(decodeHex(encodeStr.toCharArray()));
  142. System.out.println("转换前:"+srcStr);
  143. System.out.println("转换后:"+encodeStr);
  144. System.out.println("还原后:"+decodeStr);
  145. }
  146. }

分享到:
评论

相关推荐

    Go-此工具用于将16进制字符串转换成10进制byte数组

    - **加密解密**:在密码学中,16进制字符串常用于表示密钥或密文,转换为byte数组后进行加密和解密运算。 - **文件处理**:读取或写入二进制文件时,16进制字符串可以作为中间格式,方便调试和展示。 5. **注意...

    十六进制字符串按位异或运算工具和java位异或运算

    本节将详细介绍十六进制字符串的按位异或运算以及如何在Java中实现这一运算。 十六进制字符串是由0到9和A到F(或a到f)组成的字符序列,每个字符代表4位二进制数。例如,十六进制数"AB"在二进制下表示为10101011。...

    Java中char数组(字符数组)与字符串String类型的转换方法

    在Java编程中,字符数组(char数组)和字符串(String类型)是两种常见的数据表示方式,它们在处理文本信息时各有优势。在某些场景下,我们需要在两者之间进行转换,例如在处理用户输入的密码时,`jPasswordField`...

    数组与字符串.docx

    ### 数组与字符串知识点 ...综上所述,该文档涵盖了数组和字符串的基础操作,以及一个实际应用案例——猜密码小游戏。这些知识点不仅有助于初学者理解Java中数组和字符串的使用方法,也为进一步学习提供了实践基础。

    VB源代码:十六进制与Base64转换

    VB源代码,十六进制与Base64相互转换,可用于部分开发需求 1、十六进制转Base64 2、Base64转十六进制 3、数据占存 4、数据对比 密码为:1

    深入浅出密码学——常用加密技术原理与应用_深入浅出密码学——常用加密技术原理与应用_

    深入浅出密码学——常用加密技术原理与应用Cryptanalysis in simple terms -- principle and application of common encryption technology

    C#实现十六进制AES的加解密,字节数组工具类

    2. 十六进制字符串到字节数组的转换:相反地,这个方法将十六进制字符串解析回原始字节数组形式。 3. 其他辅助方法,如字节数组的复制、合并或比较等。 `AesHelper.cs`文件则专注于AES加密和解密的操作。首先,我们...

    CreateWordsFromHex:将成对的十六进制数字字符串转换为单词列表

    单词是从字典生成的,其位置与最后一个偏移量有偏移,因此可以使用更多的字典,并且十六进制字符串中没有浪费的位。 从理论上讲,对于大于256个单词的字典,我不认为不同的十六进制字符串会产生相同的单词集,因此...

    密码强度(字符串数组).cpp

    输入为一个密码字符串,字符串长度不超过50个字符。 输出说明 输出一个整数表示该密码的强度。 输入样例 输入样例1 abcd 输入样例2 ab123 输出样例 样例1输出: 1 样例2输出 2

    java 实现十六进制数转为图片Java源码

    这个过程通常涉及到将十六进制字符串解析成字节数组,然后将这些字节用作像素值来创建图像。以下是一个详细的步骤说明和相关知识点: 1. **十六进制数解析**: - 在Java中,我们可以使用`Integer.parseInt(hex...

    进制转换工具 十六进制 十进制 unicode 正转 反转

    在这个场景中,我们关注的是四个主要的进制系统:二进制、八进制、十进制和十六进制,以及与Unicode字符编码相关的转换。下面将详细阐述这些知识点。 1. **进制转换**: - **二进制(Binary)**:计算机内部存储和...

    StringUtil.java(字符串工具类)

    USER_NAME to userName,转义正则特殊字符 ,获取字符串长度汉字占两个字符,验证号码是否合法 (是否是手机号或者电话号码),将经纬度转换成字符串,将字符转换成二进制,将二进制字符串转换成int数组,...

    JAVA 字符串加密、密码加密实现方法

    在Java编程中,字符串加密和密码加密是保护敏感信息的重要手段。本文主要介绍两种常见的Java字符串和密码加密方法:MD5加密。 方案一使用的是Java内置的`MessageDigest`类来实现MD5加密。MD5(Message-Digest ...

    VBS 十六进制异或加密实现代码

    2. `WriteBin(FileName, BufferData)`:这个函数接收一个十六进制字符串`BufferData`,将其写回到一个新的二进制文件中。它同样使用了ADODB.Stream对象,先将十六进制文本转换回原始二进制数据,然后保存到指定文件...

    JAVA可逆带秘钥字符串加密算法

    本文将深入探讨“JAVA可逆带秘钥字符串加密算法”,这是一种允许数据在加密后仍能通过正确的密钥解密回原始形式的加密技术。 在Java中,最常见的可逆加密算法包括DES(Data Encryption Standard)、3DES(Triple ...

    C/C++十六进制异或运算

    在IT领域,尤其是在编程中,十六进制(Hexadecimal)是一种常见的数字表示方式,它以16个符号来表示数值,这些符号包括0-9的阿拉伯数字和A-F的字母(A代表10,B代表11,以此类推,直到F代表15)。异或(XOR)运算是...

    java中常用工具类之字符串操作类和MD5加密解密类

    散列值是字节数组,为了方便处理,通常将其转换为16进制字符串。 MD5不适用于加密数据,因为它不是可逆的,且存在碰撞问题,即不同的输入可能产生相同的输出。因此,它主要用于验证数据的完整性和一致性,比如存储...

    sshkey-cn 华为、思科、W3C RSA转16进制

    在某些情况下,这些公钥可能需要以16进制字符串的形式提供,例如在命令行接口(CLI)中手动输入。 压缩包中的“sshkey-cn.exe”很可能是一个实用程序,能够帮助用户方便地完成RSA密钥到16进制的转换。用户可能需要...

    Java中String类(字符串操作)的10个常见问题和解决方法

    标题为"Java中String类(字符串操作)的10个常见问题和解决方法"的文档主要探讨了Java语言中字符串处理的核心类String的使用细节和最佳实践。以下是根据文档内容总结的知识点: 1. 字符串比较 在Java中,比较字符串...

Global site tag (gtag.js) - Google Analytics