我正在尝试将UTF-16LE编码的字节数组重新组合成字符,而不使用java API,因为稍后我尝试执行Huffman编码时需要手动完成。我给出的代码示例实际上是在Kotlin但它的99%java,所以你不应该理解它想要完成的东西 - 在这个例子中val是char类型。
这应该相当简单,但我相信我的逻辑存在缺陷,并且想找到我的想法出错的地方。
忽略Unicode基本多语言平面中没有的任何UNICODE字符,我有以下代码行:
val c = ((((stringBytes[i].toInt()) shl 8) and 0x000000FF) or (stringBytes[i - 1].toInt() and 0x000000FF)).toChar()
它有效,但我不确定它是否正确,因为直觉上我想用以下方式编写它(注意唯一的变化是第一次掩盖)
val c = ((((stringBytes[i].toInt()) shl 8) and 0x0000FF00) or (stringBytes[i - 1].toInt() and 0x000000FF)).toChar()
然而,如果给出的第一行代码有效,则出现错误(例如显示中文字符)。
我想在BMP中组合字符的字节的步骤是:
编辑:刚刚意识到第一行代码只能工作,因为只使用了BMP中的英文字符,而第一个字节通常是十六进制的0x00。这意味着完全归零的字节将始终产生正确的结果。
最终我的问题是:第二个例子中我的逻辑出错了,为什么会产生中文字符。
如果有人能告诉我我的想法是错误的以及我如何纠正它会非常感激。谢谢!