【转】Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码

本文介绍了一个用于Java中字节到十六进制字符串转换的工具类及其测试过程,包括从字节数组转换为十六进制字符串,以及从十六进制字符串转换回字节数组的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文网址:http://blog.youkuaiyun.com/caijunjun1006/article/details/11740223

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。

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

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

 

下面是实现byte[]数组和十六进制字符串之间转化的工具类:

 

 

[java]  view plain copy
 
  1. package text.com;  
  2.   
  3. public class BytesUtil {  
  4.     /** 
  5.     * Convert byte[] to hex string. 把字节数组转化为字符串 
  6.     * 这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。 
  7.     * @param src byte[] data 
  8.     * @return hex string 
  9.     */     
  10.    public static String bytesToHexString(byte[] src){  
  11.        StringBuilder stringBuilder = new StringBuilder("");  
  12.        if (src == null || src.length <= 0) {  
  13.            return null;  
  14.        }  
  15.        for (int i = 0; i < src.length; i++) {  
  16.            int v = src[i] & 0xFF;  
  17.            String hv = Integer.toHexString(v);  
  18.            if (hv.length() < 2) {  
  19.                stringBuilder.append(0);  
  20.            }  
  21.            stringBuilder.append(hv+" ");  
  22.        }  
  23.        return stringBuilder.toString();  
  24.    }  
  25.    /** 
  26.     * Convert hex string to byte[]   把为字符串转化为字节数组 
  27.     * @param hexString the hex string 
  28.     * @return byte[] 
  29.     */  
  30.    public static byte[] hexStringToBytes(String hexString) {  
  31.        if (hexString == null || hexString.equals("")) {  
  32.            return null;  
  33.        }  
  34.        hexString = hexString.toUpperCase();  
  35.        int length = hexString.length() / 2;  
  36.        char[] hexChars = hexString.toCharArray();  
  37.        byte[] d = new byte[length];  
  38.        for (int i = 0; i < length; i++) {  
  39.            int pos = i * 2;  
  40.            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));  
  41.        }  
  42.        return d;  
  43.    }  
  44.    /** 
  45.     * Convert char to byte     
  46.     * @param c char 
  47.     * @return byte  
  48.     */  
  49.     private static byte charToByte(char c) {  
  50.        return (byte) "0123456789ABCDEF".indexOf(c);  
  51.    }  
  52. }  

下面是测试程序:

[java]  view plain copy
 
  1. package text.com;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         byte b1 = 11;  
  6.         byte b2 = 21;  
  7.         byte b3 = 31;  
  8.         byte b4 = 41;  
  9.         byte b5 = 51;  
  10.         byte b6 = 61;  
  11.         byte b7 = 71;  
  12.         byte b8 = 81;  
  13.         byte[] bytes = new byte[] { b1, b2, b3, b4, b5, b6, b7, b8 };  
  14.         String hexString = "0b 15 1f 29 33 3d 47 51";  
  15.         String str = BytesUtil.bytesToHexString(bytes);  
  16.         System.out.println("str--->" + str);  
  17.         byte[] hexStringToBytes = BytesUtil.hexStringToBytes(hexString);  
  18.         for (int i = 0; i < hexStringToBytes.length; i++) {  
  19.             System.out.println("hexStringToBytes---->" + hexStringToBytes[i]);  
  20.         }  
  21.     }  
  22.   
  23. }  


控制台输出:

 

str--->0b 15 1f 29 33 3d 47 51 
hexStringToBytes---->11
hexStringToBytes---->21
hexStringToBytes---->31
hexStringToBytes---->41
hexStringToBytes---->51
hexStringToBytes---->61
hexStringToBytes---->71
hexStringToBytes---->81

OK!

<think>嗯,用户想知道如何用Java代码将int值256转换成byte数组。首先,我得回忆一下Java中处理数据类型转换的方法。记得int是32位,而byte是8位,所以转换的时候需要考虑字节分割。可能需要将int拆分成4个byte,对吧? 这时候想到Java的ByteBuffer类,它好像有处理这种转换的功能。比如使用ByteBuffer的putInt方法,然后调用array()来获取字节数组。不过要注意字节序的问题,大端小端会影响字节的顺序。用户可能需要指定一种字节序,比如大端模式,这在网络传输中常用。 另外,用户给的例子是转换256,这个数在int中是0x00000100,转换成byte数组的话,如果使用大端模式,应该是[0x00, 0x00, 0x01, 0x00],对应的十进制就是[0, 0, 1, 0]。但需要注意byte的范围是-128到127,所以当值超过127时会变成负数。比如,如果某个字节的值是0x80,对应的byte就是-128。不过在这个例子中,256的字节拆分后每个字节都是0或1,所以不会有负数的问题。 另外,用户提供的引用中有提到使用ByteBuffer来实现转换,并且支持大小端。所以应该推荐使用ByteBuffer的方法,这样既高效又简洁。手动位移的方法虽然可行,但容易出错,尤其是在处理不同字节序的时候。 还有,用户可能没有说明是否需要处理不同长度的byte数组,比如是否需要固定为4字节,还是可以变长。但intbyte数组通常是4字节,所以应该用4字节的数组。 总结一下,步骤应该是:创建ByteBuffer,设置字节序,放入int值,提取byte数组。测试一下256的情况,看看结果是否正确。例如,大端模式下,256的字节数组应该是[0,0,1,0],但实际输出的时候,可能需要处理符号问题,但在这个例子中,每个字节的值都是正数,所以没问题。 另外,用户可能还会关心转换后的byte数组回int的情况,是否需要确保正确性,但当前问题只关注转换,所以可能不需要涉及逆过程。不过,在回答中可以提到使用ByteBuffer的getInt方法进行逆转换,以展示完整性。 最后,确保代码示例正确,没有语法错误。比如,分配一个4字节的缓冲区,放入int,然后转换数组。同时,处理可能的异常情况,比如缓冲区大小不足,但这里因为是固定int,所以没问题。</think>要将Java中的int类型转换为byte数组,可以使用`ByteBuffer`类或手动位运算两种方法。以下是使用`ByteBuffer`的标准实现方式: ### 方法1:使用ByteBuffer(推荐) ```java import java.nio.ByteBuffer; import java.nio.ByteOrder; public class IntToByteArray { public static byte[] intToBytes(int value) { ByteBuffer buffer = ByteBuffer.allocate(4); buffer.putInt(value); return buffer.array(); } public static void main(String[] args) { int number = 256; byte[] bytes = intToBytes(number); // 输出结果:[0, 0, 1, 0] System.out.println(java.util.Arrays.toString(bytes)); } } ``` ### 方法2:手动位移操作 ```java public static byte[] intToBytesManual(int value) { return new byte[] { (byte)(value >> 24), // 最高有效字节 (byte)(value >> 16), (byte)(value >> 8), (byte) value // 最低有效字节 }; } ``` ### 关键点说明 1. **字节顺序**: - 默认使用**大端序**(高位在前),例如256的十六进制为`0x00000100`,转换结果`[0, 0, 1, 0]` - 可通过`buffer.order(ByteOrder.LITTLE_ENDIAN)`改为小端序,结果变为`[0, 1, 0, 0]` 2. **符号问题**: - Java的byte范围为`-128`到`127`,若截断后值超过`127`会显示为负数,例如`(byte)0x80`等于`-128`[^3] 3. **逆向操作**: ```java public static int bytesToInt(byte[] bytes) { ByteBuffer buffer = ByteBuffer.wrap(bytes); return buffer.getInt(); } ``` ### 测试案例 输入`int value = 256`时: - 大端序输出:`[0, 0, 1, 0]` - 小端序输出:`[0, 1, 0, 0]` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值