public class VoteMsgBinCoder implements VoteMsgCoder{
public static final int MIN_WIRE_LENGTH = 4;
public static final int MAX_WIRE_LENGTH = 16;
public static final int MAGIC = 0x5400;
public static final int MAGIC_MASK = 0xfc00;
public static final int MAGIC_SHIFT = 8;
public static final int RESPONSE_FLAG = 0x0200;
public static final int INQUIRE_FLAG = 0x0100;
public VoteMsg fromWire(byte[] input) throws IOException {
ByteArrayInputStream bs = new ByteArrayInputStream(input);
DataInputStream in = new DataInputStream(bs);
int magic = in.readShort();
/*为什么是和MAGIC_MASK进行位与运算呢,为什么是和MAGIC进行比较呢,而不是其他数,小弟对位运算不是很明白*/
if ((magic & MAGIC_MASK) != MAGIC) {
throw new IOException("Bad Magic #: " +
((magic & MAGIC_MASK) >> MAGIC_SHIFT));
}
boolean resp = ((magic & RESPONSE_FLAG) != 0);
boolean inq = ((magic & INQUIRE_FLAG) != 0);
int candidateID = in.readShort();
if (candidateID < 0 || candidateID > 1000) {
throw new IOException("Bad candidate ID: " + candidateID);
}
long count = 0;
if (resp) {
count = in.readLong();
if (count < 0) {
throw new IOException("Bad vote count: " + count);
}
}
// Ignore any extra bytes
return new VoteMsg(resp, inq, candidateID, count);
}
}
(magic & MAGIC_MASK) != MAGIC)
magic是一组二进制位开关
MAGIC_MASK作为参照
这里的意思就是,判断MAGIC_MASK标记为1的字段,在magic中是否全为1
举例
m M m&M m&M==M
00 01 00 0
01 01 01 1
10 01 00 0
11 01 01 1
参见下图:
5 4 F C
[ 7] = <0>─┤ │ <1>─┤ │
[ 6] = <1>─┤ │ <1>─┤ │
[ 5] = <0>─┤ │ <1>─┤ │
[ 4] = <1>─┘ │ <1>─┘ │
[ 3] = <0>───┤ <1>───┤
[ 2] = <1>───┤ <1>───┤
[ 1] = <0>───┤ <0>───┤ RESPONSE_FLAG
[ 0] = <0>───┘ <0>───┘ INQUIRE_FLAG