如何在java中将字符串转换为32位对齐的字节数组?

时间:2014-01-27 21:24:50

标签: java bit-manipulation

标题本身可能不是自我解释的。让我举个例子:

_test5f 74 65 73 74(在ascii中总共5个字节)

但是出于某种原因,我需要将其打包成一个字节数组,如:

5f 74 65 73 74 00 00 00

(0的最后3个字节是用于进行对齐的填充字节)

换句话说,在使用write()逐个写入这些字节之前,我需要计算填充字节数。

我可以用这种方式获得我想要的数字:(4 - str.length() % 4) % 4但是我很好奇是否有另一种有效方法可以获得它(例如逐位操作)。

3 个答案:

答案 0 :(得分:3)

是的,如果使用定点CPU ,那么会更有效率,对于/和{{{{}}等分区操作1}}用软件实现:%

答案 1 :(得分:2)

要计算出达到4的倍数的填充量,我们需要查看的是长度的最后2位。

Last 2 bits   Padding   Padding
 of Length    Needed    in binary
    00          0          00
    01          3          11
    10          2          10
    11          1          01

这表明了一种模式。如果长度是偶数(最后一位0),则填充等于长度的最后2位;否则它是第一位翻转的最后2位。

这可以表示为

(len & 0x03) ^ ((len & 0x01) << 1)

即。取最后2位的长度和xor,最后一位向左移1位。

注意:如果您这样做,请务必在代码中对其进行评论,以便下一个必须阅读此内容的人不必花费10分钟来计算出来。

答案 2 :(得分:1)

str.length()与字节数不同。仅当您使用ASCII字符串时才会出现这种情况。如果oyu有非ASCII字符串(德语,法语,...),那么确定字节数的正确方法如下:

int nBytes = str.getBytes("UTF8").length();

确定32位对齐长度是微不足道的。