字节数组转字符数组

4

我需要将原始字节数据以字符形式显示,但遇到了一些问题,例如 [ 1, 32, -1, -1 ](字节数据),转换为字符时变成了 [1, 3, 2, -, 1, - ,1]。

我的要求是将 [ 1, 32, -1, -1 ] 转换成字符格式。

最初,我使用了以下命令:

StringBuilder buffer = new StringBuilder();
    for(int i = 0; i < byte1.length;i++){
    buffer.append(byte1[i]);
    }
char[] c = buffer.toString().toCharArray();

没有满足我的要求。

然后我使用了

char dig = (char)(((int)'0')+ (-32));

it gave an invalid output

请帮我满足我的需求。提前感谢。


1
你希望像 -1 这样的数字以什么形式表示为字符?你只需要字面上的 - 符号吗? - Floris
确切地说,我没有主意,但遗憾的是那是我的要求...任何替代方法也行... - Jeetesh Nataraj
请参阅:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html char 只能表示一个单个字符,所以 32 不可能是一个字符。同样的道理,-1 也不是一个字符。32 和 -1 需要两个 char 来表示。 - Jeroen
1
你是指 byte[] 而不是 Byte[] 吗? - Adam
我想你可以直接将有符号的转换为无符号字节;但是,你最终会得到在127以上的“ASCII”代码,这看起来不会很好看... 另外,会有控制代码(例如,数字12将清空屏幕)。我认为这不是一个明智的“要求”,除非你允许“转义”所有不在0x20-0x7F范围内的字符。 - Floris
@ Adam,是的,它是byte[]... - Jeetesh Nataraj
4个回答

2
如果您只需要一个可打印的表示:
String readable = Arrays.toString(byte1);

但是,正如所述,您需要一个类似于字符串数组的东西来实现这一点。

2

为什么你需要坚持使用字符串,使用字符数组的数组,首先在长度不足时附加额外的0。如果你的数据是以字节格式存在的,则使用bytes1.toString(),然后类似于以下内容:

public class Example {

    public static void main(String args[])
    {
        String[] byte1 = {"2","45","56","1"};
        for (int i = 0; i < byte1.length; i++) {
            if(byte1[i].length()<2){
                byte1[i] = "0"+byte1[i];
            }
        }
        char[][] chr = new char[5][10];
        StringBuilder buffer = new StringBuilder();
        for(int i = 0; i < byte1.length;i++){
               chr[i] = byte1[i].toCharArray();
        }


    for (int i = 0; i < chr.length; i++) {
            System.out.println(chr[i]);
    }
    }
}

1
也许以下内容适合您:
byte byte1[] = {72, 101, 108, 108, 111, 33, 92, 45, 127, -5, -23};
StringBuilder buffer = new StringBuilder();
    for(int i = 0; i < byte1.length;i++){
      if (byte1[i] >= 32 && byte1[i] != 92 && byte1[i] != 127) buffer.append((char)byte1[i]);
      else {
        String temp;
        if (byte1[i] == 92) {
          buffer.append("\\\\");
        }
        else {
          temp = String.format("\\0x%02x", byte1[i]);
          buffer.append(temp);
        }
      }
    }
System.out.println(buffer);

这将产生输出:
Hello!\\-\0x7f\0xfb\0xe9

"representable"字符将被正常打印,其他字符将转换为“转义”十六进制代码。 \ 获得特殊处理 - 如果您想显示具有反斜杠转义的十六进制代码,则需要反斜杠来转义反斜杠(并且要在输出中获得\\,则需要在代码中使用"\\\\"...

我还单独捕获了字符值127,因为我不希望字符串中出现DEL - 不确定根据环境会产生什么影响。

如果您的要求确实与您描述的完全相同,则可以考虑以下代码(它会产生您所要求的内容):

byte byte1[] = {1, 32, -1, -1};
StringBuilder buffer = new StringBuilder();
buffer.append("[");
for(int i = 0; i < byte1.length - 1;i++){
  buffer.append(String.format("%d,", byte1[i]));
}
buffer.append(String.format("%d]", byte1[byte1.length - 1]));
System.out.println(buffer);

输出:

[1,32,-1,-1]

注意 - 由于某些数字需要多个字符,因此您最终得到的字符串长度可能超过4个字符。无法避免这种情况。


第二个和 Arrays.toString(byte[]) 产生的结果相同吗? - Jan

-1

由于 char 字段只能存储一个字符,因此无法在 char 字段中存储两个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接