ipFile 是个随机文件访问类
private long readLong4(long offset) {
long ret = 0;
try {
ipFile.seek(offset);
ret |= (ipFile.readByte() & 0xFF);
ret |= ((ipFile.readByte() << 8) & 0xFF00);
ret |= ((ipFile.readByte() << 16) & 0xFF0000);
ret |= ((ipFile.readByte() << 24) & 0xFF000000);
return ret;
} catch (IOException e) {
return -1;
}
}
小弟才疏学浅实在是对上面几行代码很头疼,不知哪位大虾帮我解读
都要弄成2进制进行计算,最后结果再转换成16进制,这样更简单些,当然你计算能力够好,直接用十六进制的计算
例子如下:
0x1D<<24:这个是“移位”运算
0x1D的二进制编码是:0000 0000 0000 0000 0000 0000 0001 1101
<<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
0x1D<<24后是:0001 1101 0000 0000 0000 0000 0000 0000
(0x1D << 24) & 0xFF000000:这个是“与”运算
0xFF000000化成二进制是:1111 1111 0000 0000 0000 0000 0000 0000
& 运算规则:同1的时候为1,否则都为0
对齐位置计算:(0x1D << 24) & 0xFF000000
0001 1101 0000 0000 0000 0000 0000 0000
1111 1111 0000 0000 0000 0000 0000 0000
结果:0001 1101 0000 0000 0000 0000 0000 0000
最后一个是“或”运算(同理,自己计算)
| 运算规则:同0的时候才是0,否则都是1
这样如果再不明白就无语了。。。。。
给个例子就清楚了
[code="java"]public class Test {
private static long readLong4() {
long ret = 0;
ret |= (0x34 & 0xFF);
ret |= ((0x67 << 8) & 0xFF00);
ret |= ((0xAB << 16) & 0xFF0000);
ret |= ((0x1D << 24) & 0xFF000000);
return ret;
}
public static void main(String[] args) {
System.out.println(Long.toHexString(readLong4()));
}
}[/code]
输出:
1dab6734
“|”、 “&”、“<<”
这些都是运算符,或、并、移位,并涉及到进制的一些计算
[quote]“ret |= ((0x1D << 24) & 0xFF000000);”这句是什么意思[/quote]
1 0x1D << 24 // 对16进制数0x1D左移24位
例如:
0x1D变成 0x1D000000
2 0x1D000000 & 0xFF000000
还是0x1D000000 (这里如果你的输入不是0x1D,比如是0x11D,那么只有低字节的保留,高字节的被与掉了。)
3 ret |= 0x1D000000
即: ret = ret | 0x1D000000;
其实就是把1D这两位附上ret,因为之前ret第四个字节是没有值的。