字符串和字节数组的拼接

5

我有一个字符串需要与一个字节数组拼接,我尝试了以下方法:

String msg = "msg to show";

byte[] msgByte = new byte[msg.length()];

try {
msgByte = msg.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

byte[] command = {2,5,1,5}

byte[] c = new byte[msgByte.length + command.length];
System.arraycopy(command, 0, c, 0, command.length);
System.arraycopy(msjByte, 0, c, command.length, msjByte.length);

for(Byte bt:c)
    System.out.println(bt+"");

这是输出结果:
2 5 1 5 109 115 103 32 ...

但我需要的结果是这样的:
2 5 1 5 m s g ...

因为它被用作蓝牙打印机的命令,所以我需要它在一个数组中。
有什么方法或建议吗?
提前感谢! :)

你已经得到正确的结果了。ascii(109)= m。这是一个相当低级的接口,将命令代码与字符串混合在一起吗? - Jochen Bedersdorfer
我的错误,我以为数组中的ASCII代码有问题,因为打印机的示例命令如下:byte[] ESC_Z2 = {0x1b, 0x5a, 0x00 , 0x51, 0x05, 0x14 , 0x00 ,'m', 'e', 's', 's','a','g','e' }; 所以我尝试发送纯ASCII代码,但它没有起作用,后来发现是命令中的参数问题。 - dev mz
2个回答

4
根据文档,你无法拥有一个包含'2 5 1 5 m s g'的字节数组:

byte数据类型是一个8位带符号的二进制补码整数。它的最小值为-128,最大值为127(包括边界)。

我无法想象实际应用时需要将未编码的字节与字符串连接的场景,但是这里提供了一种返回char[]的解决方案。
public static void main(String[] args) {
    final String msg = "msg to show";
    final byte[] command = { 2, 5, 1, 5 };

    // Prints [2, 5, 1, 5, m, s, g,  , t, o,  , s, h, o, w]
    System.out.println(Arrays.toString(concat(msg, command)));
}

private static char[] concat(final byte[] bytes, final String str) {
    final StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(b);
    }
    sb.append(str);
    return sb.toString().toCharArray();
}

1

另一种选择是这样做...

String msg = "msg to show";
char[] letters = msg.toCharArray();
byte[] command = {2,5,1,5};
String result;
for (String str: command) {
    result += str + " ";
}
for (String str: letters) {
    result += str + " ";
}
System.out.println(result);

1
你可以将字符转换为字节,只要你知道自己在做什么。只要你清楚编码方式,将小于127的字符表示为字节并没有任何问题。 - Jochen Bedersdorfer
谢谢你指出来!我会修改我的答案。 - fireshadow52
@Jochen:我不同意。OP明确表示他要的结果是“2 5 1 5 m s g”。字节数组只能包含整数。我知道你的意思,但OP对将字符“编码”并不满意,因为他已经尝试过这样做(2 5 1 5 109 115 103 32)。 - hoipolloi
如果他想要发送的命令字节的值为2,那么这只是一种解释问题。 - Jochen Bedersdorfer

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