【问题标题】:How to compare byte-packed string in Java?如何比较Java中的字节打包字符串?
【发布时间】:2019-04-10 15:51:07
【问题描述】:

我的 Java 应用程序有一个字节压缩的 String 对象,该对象是从通过外部连接接收到的远程数据组装而成的。字符串被组装,如下所示:

byte[] buffer = new byte[20];
/* ... buffer is loaded ... */
int j = 9;
String strVal = "";
for( i=0; i<8; i++ )
{
    strVal += (char)buffer[j++];
}
strVal += '\0';

稍后,我需要验证接收到的数据,但是当我尝试以下操作时,它返回 false。缓冲区中的数据和strVal 的内容(至少我可以在调试器中查看)都是我所期望的。有什么想法吗?

return strVal.equals("STR GOOD"); // evaluates as false when should be true

【问题讨论】:

  • 你有没有试过做一个简单的 System.out.println(strVal);只是为了查看 strVal 中存储的内容。顺便说一句,你为什么要这样做 strVal += '\0';在java中?我认为你不需要在java中将它取出来看看它是否解决了问题。
  • 为什么要在 strVal 后面附加一个 '\0'?
  • 为什么在循环中使用 j 作为 buffer[] 的索引?不应该是我吗?
  • 我认为他使用 j 是因为他不想要完整的单词他只想要位置 9 和 17 之间的单词 store。
  • “字节压缩”是什么意思?您的代码似乎暗示这些字节只是 ASCII 字节,它并不是真正“打包”的,只是用单字节字符集编码,所以使用 new String(buffer, 9, 8, StandardCharsets.US_ASCII) 将从索引 9 开始的 8 个字节转换为字符串。

标签: java string-comparison


【解决方案1】:

从字节数组末尾删除'\0' 解决了这个问题。

【讨论】:

    【解决方案2】:

    不要追加0,在循环中使用i:

        byte[] buffer = new byte[20];
        /* ... buffer is loaded ... */
    
        String strVal = "";
        for (int i = 0; i < 8; i++) {
            strVal += (char) buffer[i];
        }
    

    【讨论】:

    • 您还可以查看此答案,该答案很好地解释了为什么字符串中不需要 \0 。 stackoverflow.com/questions/26558741/…
    • 你为什么假设当 OP 专门编写代码来提取从索引 9 开始的字符串时,OP 不是这个意思?你的答案读起来像“在循环中使用 i”是“不要附加 0”的解决方案,当然不是这样。要不附加 0,只需删除 循环之后的语句,即显式添加 0 的语句。
    猜你喜欢
    • 1970-01-01
    相关资源
    最近更新 更多