来自 byte[] 的 BitSet 具有奇怪的长度
BitSet from byte[] with strange lenght
我的代码是:
String blah = "blah";
byte[] blahBytes = blah.getBytes("US-ASCII");
System.out.println(Arrays.toString(blahBytes));
BitSet set = BitSet.valueOf(blahBytes);
System.out.println(set.length());
输出是:
[98, 108, 97, 104]
31
为什么 length()
返回 31?不应该是32吗?
位集长度由设置为1
的最高位的位置决定。由于传递给构造位集的所有字节都表示 UNICODE 的 ASCII 字符子集,因此第 8 位始终为零。因此,设置为 1
的最高位将是第 30 位或第 31 位,具体取决于字符串末尾的字母或数字:如果您传递 "bla1"
而不是 "blah"
会得到 30 (demo 1). If you use control characters, such as <TAB>
you could get an even shorter bit set of 28 (demo 2).
如果您想将长度四舍五入为下一个 8 的倍数,请使用
int roundedLength = 8 * ((set.length() + 7) / 8);
我的代码是:
String blah = "blah";
byte[] blahBytes = blah.getBytes("US-ASCII");
System.out.println(Arrays.toString(blahBytes));
BitSet set = BitSet.valueOf(blahBytes);
System.out.println(set.length());
输出是:
[98, 108, 97, 104]
31
为什么 length()
返回 31?不应该是32吗?
位集长度由设置为1
的最高位的位置决定。由于传递给构造位集的所有字节都表示 UNICODE 的 ASCII 字符子集,因此第 8 位始终为零。因此,设置为 1
的最高位将是第 30 位或第 31 位,具体取决于字符串末尾的字母或数字:如果您传递 "bla1"
而不是 "blah"
会得到 30 (demo 1). If you use control characters, such as <TAB>
you could get an even shorter bit set of 28 (demo 2).
如果您想将长度四舍五入为下一个 8 的倍数,请使用
int roundedLength = 8 * ((set.length() + 7) / 8);