标题本身可能不是自我解释的。让我举个例子:
_test
是5f 74 65 73 74
(在ascii中总共5个字节)
但是出于某种原因,我需要将其打包成一个字节数组,如:
5f 74 65 73 74 00 00 00
(0的最后3个字节是用于进行对齐的填充字节)
换句话说,在使用write()逐个写入这些字节之前,我需要计算填充字节数。
我可以用这种方式获得我想要的数字:(4 - str.length() % 4) % 4
但是我很好奇是否有另一种有效方法可以获得它(例如逐位操作)。
答案 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位对齐长度是微不足道的。