byte数组转换成String的时候出现NUL域,怎么过滤或者去除 nul域被显示为空格

在Java中,当你将byte数组转换成String时,如果byte数组中包含NUL字符(即值为0的字节),这些NUL字符在转换后的字符串中也会体现出来,表现为字符串中的空字符(虽然肉眼不可见,但会占用字符串的长度)。如果你想要过滤或去除这些NUL字符,你可以在转换过程中或转换后进行处理。

方法一:在转换后处理
你可以在将byte数组转换为String之后,使用String的replace()方法将\0(NUL字符的字符串表示)替换为空字符串(“”),从而去除它们。但是,需要注意的是,\0在Java字符串中并不是一个有效的转义序列来表示NUL字符;实际上,字符串中的\0会被解释为两个字符:反斜杠(\)和数字0(0)。不过,由于我们的目标是处理byte数组转换后得到的字符串中的NUL字符,这些字符在字符串中是不可见的,并且它们的存在只是增加了字符串的长度,所以我们可以通过遍历字符串并检查每个字符的ASCII值来过滤它们。但更简单的方法是,由于我们知道NUL字符在字符串中表现为ASCII码为0的字符,而Java字符串中的字符实际上是通过char类型表示的,且char类型是无符号的,我们可以利用这个特性来过滤它们。然而,直接过滤在String层面上并不直观,因为String是不可变的。更好的做法是使用StringBuilder或StringBuffer来构建新的字符串,同时跳过NUL字符。

但是,对于简单的替换需求,我们可以利用String的replaceAll()方法和一个正则表达式来匹配并替换所有ASCII码为0的字符(虽然这在技术上不是直接替换\0,但效果相同):

java
String strWithNulls = new String(bytesWithNulls, StandardCharsets.UTF_8); // 假设bytesWithNulls包含NUL
String strWithoutNulls = strWithNulls.replaceAll(“\u0000”, “”); // 使用正则表达式替换所有NUL字符
注意:这里的\u0000是Unicode中NUL字符的表示。

方法二:在转换前处理
另一种方法是在将byte数组转换为String之前,就过滤掉数组中的NUL字节。这可以通过遍历byte数组并使用ArrayList(或任何你选择的集合类型)来收集非NUL字节,然后再将这个集合转换回byte数组(如果需要的话),最后再将这个数组转换为String。但是,这种方法相对复杂且可能不是最高效的,特别是如果你只需要去除NUL字符并且不关心转换过程中的额外步骤。

import java.util.ArrayList;
import java.util.List;

public class ByteArrayToStringWithoutNulls {

public static void main(String[] args) {  
    // 假设这是包含NUL字节的原始byte数组  
    byte[] bytesWithNulls = { 'H', 'e', 'l', 'l', 'o', 0, 'W', 'o', 'r', 'l', 'd', '!', 0, 0 };  

    // 过滤NUL字节  
    byte[] bytesWithoutNulls = filterNulBytes(bytesWithNulls);  

    // 将过滤后的byte数组转换为String  
    String strWithoutNulls = new String(bytesWithoutNulls, StandardCharsets.UTF_8);  

    // 输出结果  
    System.out.println(strWithoutNulls); // 输出: HelloWorld!  
}  

// 过滤byte数组中的NUL字节  
public static byte[] filterNulBytes(byte[] bytes) {  
    List<Byte> nonNullBytes = new ArrayList<>();  
    for (byte b : bytes) {  
        if (b != 0) { // NUL字节的值为0  
            nonNullBytes.add(b);  
        }  
    }  

    // 将List<Byte>转换回byte[]  
    byte[] result = new byte[nonNullBytes.size()];  
    for (int i = 0; i < nonNullBytes.size(); i++) {  
        result[i] = nonNullBytes.get(i);  
    }  

    return result;  
}  

}

总结
对于大多数情况,推荐使用第一种方法,即在转换后使用replaceAll()方法和正则表达式来过滤NUL字符。这种方法简单且有效,能够直接处理转换后的字符串。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值