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)
有没有更好的方法来处理这个问题?
谢谢
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字符.但是,您不能随意决定 - 您需要确保生成和使用此数据的所有内容都符合编码.
如果您在协议控制的时候,那将是多好,如果你能在字符串前面介绍的长度前缀,以表明多少字节的编码形式.这样,您就能够准确读取正确数量的数据(没有"过度读取"),并且您可以判断数据是否因某种原因被截断.
| 归档时间: |
|
| 查看次数: |
16512 次 |
| 最近记录: |