如何检测字节数组中的字符串结尾到字符串转换?

gru*_*unk 5 java string bytearray type-conversion

我从socket接收一个字节数组中的字符串,如下所示:

[128,5,6,3,45,0,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)

网络协议给出的大小是字符串的总长度(包括零),因此,在我的例子中10.

如果我只是这样做:

String myString = new String(myBuffer); 
Run Code Online (Sandbox Code Playgroud)

我在字符串5的末尾没有正确的字符.转换似乎没有检测到字符串caracter(0)的结束.

要获得正确的大小和正确的字符串,我这样做:

int sizeLabelTmp = 0;
//Iterate over the 10 bit to get the real size of the string
for(int j = 0; j<(sizeLabel); j++) {
    byte charac = datasRec[j];
    if(charac == 0)
        break;
    sizeLabelTmp ++;
}
// Create a temp byte array to make a correct conversion
byte[] label    = new byte[sizeLabelTmp];
for(int j = 0; j<(sizeLabelTmp); j++) {
    label[j] = datasRec[j];
}
String myString = new String(label);
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理这个问题?

谢谢

Yuv*_*uvi 11

可能为时已晚,但它可能对其他人有所帮助.你能做的最简单的事情就是new String(myBuffer).trim()给你你想要的东西.


Jon*_*eet 7

0不是"字符串结尾字符".这只是一个字节.它是否只出现在字符串的末尾取决于您正在使用的编码(以及文本可以是什么).例如,如果使用UTF-16,则ASCII字符的每隔一个字节为0.

如果你确信的是,第一个0表示字符串的结尾,你可以使用的东西,就像你给的代码,但我把它改写为:

int size = 0;
while (size < data.length)
{
    if (data[size] == 0)
    {
        break;
    }
    size++;
}

// Specify the appropriate encoding as the last argument
String myString = new String(data, 0, size, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

强烈建议您不要只使用平台默认编码 - 它不可移植,并且可能不允许所有Unicode字符.但是,您不能随意决定 - 您需要确保生成和使用此数据的所有内容都符合编码.

如果您在协议控制的时候,那将是好,如果你能在字符串前面介绍的长度前缀,以表明多少字节的编码形式.这样,您就能够准确读取正确数量的数据(没有"过度读取"),并且您可以判断数据是否因某种原因被截断.