关于byte的各种转换

本文详细介绍了Java中字节(byte)与整型(int)、十六进制(hex)、字符串(String)之间的转换方法,包括字节到整型、字节到字符串、十六进制到字节、字节数组到字符串、字符串到字节数组等常用转换操作。

本文的代码是有关于:byte与int,hex,String;byte[]和HexString,String之间的转换的。各种类型之间的转换,看下面两张图


图1 与byte有关的转换


图2 与byte[]有关的转换


1、byte转int

	public static int unsignedByteToInt(byte b){
		return (int)b&0xFF;
	}
2、byte和String相互转换

2.1、byte转成String的三种方法

		//_01 byte转换为String   Byte.toString(byte b)
		byte bb = 65;
		System.out.println(Byte.toString(bb));

		//_02 byte转换为String	byte+""
		System.out.println(bb+"");
	 
		//_03 byte转换为String	new String(new byte[]{byte b}),这种可以将65转换成"A",而不是"65"
		System.out.println(new String(new byte[]{bb}));

2.2、String转换为byte

String s = "65";
byte b3 = Byte.valueOf(s);
2.3、byte转换为Hex
public static String byteToHex(byte b){
		int i = b&0xFF;
		return Integer.toHexString(i);
	}
3、byte[]和String与HexString之间的转换

3.1、byte[]转换为String

byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46};
        String value = new String(byteArray);
        System.out.println(value);
3.2、String转换为byte[]

就是用getBytes()函数

3.3、byte[]转换为HexString

	public static String byteArrayToHexString(byte[] b){
		StringBuilder sb = new StringBuilder(b.length*2);
		for(int i= 0;i<b.length;i++){
			int v = b[i]&0xff;
			if(v<16){
				sb.append('0');
			}
			sb.append(Integer.toHexString(v));
		}
		return sb.toString().toUpperCase();
	}
3.4、HexString转换为byte[]
	public static byte[] hexStringToByteArray(String s){
		byte[] b = new byte[s.length()/2];
		for(int i = 0 ;i<b.length;i++){
			int index = i*2;
			int v = Integer.parseInt(s.substring(index,index+2),16);
			b[i] = (byte)v;
		}
		return b;
	}






<think> 根据用户的问题,需要将byte数组转换为String。根据引用[1]和引用[3],转换时需要注意字符编码,避免出现乱码或转换错误。常见的转换方法包括使用String的构造函数并指定字符编码,或者使用Base64编码(如引用[2]所示)来安全地转换二进制数据。 引用[1]提到,在转换前可以过滤掉NUL字节,但这种方法可能复杂且低效。引用[2]展示了C#中使用String.Join和Convert.ToBase64String的方法,但用户使用的是Java,因此需要Java中的方法。引用[3]则指出在转换时指定字符编码(如"ISO-8859-1")可以避免乱码。 在Java中,将byte数组转换为String的常用方法有: 1. 使用String的构造函数,并指定字符编码(如UTF-8或ISO-8859-1): ```java String str = new String(byteArray, "UTF-8"); ``` 2. 使用Base64编码(适用于二进制数据的安全转换,避免数据损坏): ```java String encodedString = Base64.getEncoder().encodeToString(byteArray); ``` 如果byte数组包含的是文本数据,使用第一种方法;如果是任意二进制数据(如图片),推荐使用Base64编码。 因此,根据用户需求,我们提供两种方法: 方法一:使用String构造函数(适合文本数据) ```java // 假设byteArray是文本数据的字节数组 String str = new String(byteArray, StandardCharsets.UTF_8); // 推荐使用UTF-8 ``` 方法二:使用Base64编码(适合任意二进制数据) ```java // 将byte数组转换为Base64字符串 String base64String = Base64.getEncoder().encodeToString(byteArray); // 从Base64字符串转回byte数组 byte[] decodedBytes = Base64.getDecoder().decode(base64String); ``` 注意:如果使用String构造函数转换任意二进制数据,可能会因为某些字节序列在指定字符编码中无效而导致数据损坏。因此,对于非文本数据,强烈推荐使用Base64。 根据引用[3],如果遇到乱码问题,可以尝试使用"ISO-8859-1"编码,因为它能完整保留所有字节而不丢失信息: ```java String str = new String(byteArray, "ISO-8859-1"); // 转回byte数组 byte[] original = str.getBytes("ISO-8859-1"); ``` 这种方法可以保证原始byte数组和转换后的byte数组一致,但生成的字符串可能包含不可打印字符。 因此,选择哪种方法取决于byte数组的内容和用途: - 文本数据:使用UTF-8等字符编码。 - 二进制数据:使用Base64编码(可打印且安全)。 下面我们提供完整的示例代码: </think> ### Java中byte数组转换为String的方法 在Java中,将byte数组转换为String需要正确处理字符编码,以下是完整解决方案: #### 方法1:使用构造函数指定字符编码(推荐) ```java // 示例byte数组 byte[] byteArray = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100}; // 使用UTF-8编码转换(最常用) String str1 = new String(byteArray, StandardCharsets.UTF_8); // 使用ISO-8859-1编码(保证无损转换) String str2 = new String(byteArray, "ISO-8859-1"); ``` **特点**: 1. 显式指定字符编码避免平台默认编码问题[^3] 2. `ISO-8859-1`保证字节与字符的一一对应关系,不会丢失数据 3. 转换效率高,时间复杂度$O(n)$ #### 方法2:Base64编码(适用于二进制数据) ```java // 编码为Base64字符串 String base64String = Base64.getEncoder().encodeToString(byteArray); // 解码回byte数组 byte[] decodedBytes = Base64.getDecoder().decode(base64String); ``` **适用场景**: - 图片、加密数据等二进制内容[^2] - 需要网络传输或存储的场景 - 需要可打印字符表示时 #### 方法3:十六进制字符串表示 ```java // 转换十六进制字符串 StringBuilder hexString = new StringBuilder(); for (byte b : byteArray) { hexString.append(String.format("%02X", b)); } // 转换byte数组(需要解析) byte[] restored = new byte[hexString.length() / 2]; for (int i = 0; i < restored.length; i++) { restored[i] = (byte) Integer.parseInt(hexString.substring(2*i, 2*i+2), 16); } ``` **特点**: - 人类可读格式 - 适用于调试和日志记录 - 存储效率较低(体积扩大2倍) ### 选择指南 | 方法 | 适用场景 | 是否可逆 | 数据膨胀率 | |--------------|-----------------------------|----------|------------| | 指定字符编码 | 文本数据(UTF-8/ISO-8859-1) | 是 | 1:1 | | Base64 | 二进制数据/网络传输 | 是 | 约33% | | 十六进制 | 调试/日志记录 | 是 | 100% | ### 注意事项 1. **避免使用无参构造函数**: ```java // 不推荐!依赖平台默认编码 String badString = new String(byteArray); ``` 2. **处理特殊字符**: ```java // 过滤NUL字符(0x00) byte[] filtered = Arrays.stream(byteArray) .filter(b -> b != 0) .toArray(); ``` 3. **大数组处理**: ```java // 使用CharsetDecoder处理超大数组 CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); CharBuffer charBuffer = decoder.decode(ByteBuffer.wrap(hugeByteArray)); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值