为什么 base64 编码 java 代码这样做
why is the base64 encode java code doing this
所以我试图更好地理解 base64 编码,我在维基百科上看到了这个实现
private static String base64Encode(byte[] in) {
StringBuffer out = new StringBuffer((in.length * 4) / 3);
int b;
for (int i = 0; i < in.length; i += 3) {
b = (in[i] & 0xFC) >> 2;
out.append(codes.charAt(b));
b = (in[i] & 0x03) << 4;
if (i + 1 < in.length) {
b |= (in[i + 1] & 0xF0) >> 4;
out.append(codes.charAt(b));
b = (in[i + 1] & 0x0F) << 2;
if (i + 2 < in.length) {
b |= (in[i + 2] & 0xC0) >> 6;
out.append(codes.charAt(b));
b = in[i + 2] & 0x3F;
out.append(codes.charAt(b));
} else {
out.append(codes.charAt(b));
out.append('=');
}
} else {
out.append(codes.charAt(b));
out.append("==");
}
}
return out.toString();
}
我一直在跟进,然后我到了:
b = (in[i] & 0xFC) >> 2;
我不明白...为什么要将 bitwise
和 252
转换为一个数字然后将其移动 right 2
...这会不会一样如果您只是移动字节本身而不进行按位运算?示例:
b = in[i] >> 2;
假设我的 in[i]
是 letter e
...表示为 101
或 binary 01100101
。如果我将 2 向右移动,我会得到 011001
或 25
。如果我按位 & 它我得到
01100101
11111100
--------
01100100
但是无论如何,轮班都会砍掉最后两个......那么为什么要这样做呢?
有人可以为我澄清一下吗?谢谢。
IN in[i] >> 2
,in[i]
首先转换为 int
。如果它是一个负字节(设置了高位),它将被转换为一个负整数(也设置了现在最高的 24 位)。
在(in[i] & 0xFC) >> 2
中,in[i]
如上所述转换为int
,然后& 0xFC
确保额外的位全部重置为0。
您说对了一部分,因为 (in[i] & 0xFF) >> 2
会给出相同的结果。 & 0xFF
是将字节转换为 0 到 255 范围内的非负数 int
的常用方法。
要确定原始开发人员为什么使用 0xFC
而不是 0xFF
的唯一方法是询问他们 - 但我推测这是为了让哪些位正在使用更明显用过。
所以我试图更好地理解 base64 编码,我在维基百科上看到了这个实现
private static String base64Encode(byte[] in) {
StringBuffer out = new StringBuffer((in.length * 4) / 3);
int b;
for (int i = 0; i < in.length; i += 3) {
b = (in[i] & 0xFC) >> 2;
out.append(codes.charAt(b));
b = (in[i] & 0x03) << 4;
if (i + 1 < in.length) {
b |= (in[i + 1] & 0xF0) >> 4;
out.append(codes.charAt(b));
b = (in[i + 1] & 0x0F) << 2;
if (i + 2 < in.length) {
b |= (in[i + 2] & 0xC0) >> 6;
out.append(codes.charAt(b));
b = in[i + 2] & 0x3F;
out.append(codes.charAt(b));
} else {
out.append(codes.charAt(b));
out.append('=');
}
} else {
out.append(codes.charAt(b));
out.append("==");
}
}
return out.toString();
}
我一直在跟进,然后我到了:
b = (in[i] & 0xFC) >> 2;
我不明白...为什么要将 bitwise
和 252
转换为一个数字然后将其移动 right 2
...这会不会一样如果您只是移动字节本身而不进行按位运算?示例:
b = in[i] >> 2;
假设我的 in[i]
是 letter e
...表示为 101
或 binary 01100101
。如果我将 2 向右移动,我会得到 011001
或 25
。如果我按位 & 它我得到
01100101
11111100
--------
01100100
但是无论如何,轮班都会砍掉最后两个......那么为什么要这样做呢?
有人可以为我澄清一下吗?谢谢。
IN in[i] >> 2
,in[i]
首先转换为 int
。如果它是一个负字节(设置了高位),它将被转换为一个负整数(也设置了现在最高的 24 位)。
在(in[i] & 0xFC) >> 2
中,in[i]
如上所述转换为int
,然后& 0xFC
确保额外的位全部重置为0。
您说对了一部分,因为 (in[i] & 0xFF) >> 2
会给出相同的结果。 & 0xFF
是将字节转换为 0 到 255 范围内的非负数 int
的常用方法。
要确定原始开发人员为什么使用 0xFC
而不是 0xFF
的唯一方法是询问他们 - 但我推测这是为了让哪些位正在使用更明显用过。