位屏蔽和移位逻辑(Java)

时间:2015-10-11 01:43:08

标签: java bit masking

我正在尝试将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中组合字符的字节的步骤是:

  • 将第一个(最重要的)字节向左移动8
  • 与0x0 ... FF..00对齐,将所有不必要的位清零。
  • 和LSB一起使用0x0 ... FF将除LSB之外的所有不必要的位清零
  • 最后,将这些值组合在一起以产生2字节的char值。

编辑:刚刚意识到第一行代码只能工作,因为只使用了BMP中的英文字符,而第一个字节通常是十六进制的0x00。这意味着完全归零的字节将始终产生正确的结果。

最终我的问题是:第二个例子中我的逻辑出错了,为什么会产生中文字符。

如果有人能告诉我我的想法是错误的以及我如何纠正它会非常感激。谢谢!

0 个答案:

没有答案