发现网上很多求反码的教程都是, 但是不一定是对的
NEC红外协议有一个规定, usercode = data反码(高位) data(低位)
例如: 0x4C 需要转为: 0xB34C 其中B3是4C的反码
代码
public int getUserCode(int dcode) {
return dcode + ((dcode ^ 0x000000FF) << 8); //注意 << 优先级低于+,
如果没有小括号,会先+再<<
}
计算方案:
算法 1
int dcode = 0x4C;
LogUtil.d("dcode" + dcode);
int rcode = (0x4C ^ 0x000000FF) << 8; //求4C的反码, 然后右移8位
int userCode = dcode + rcode;
LogUtil.d("userCode " + userCode);
LogUtil.d("0xB34C " + 0xB34C); //最后的结果验证
0. 一个int 是32位, 四个字节 十六进制表示: 00 00 00 00
1. 0x4c =
内存中 00 00 00 4C
2. 0x4c ^ 0x000000FF= 内存中 00 00 00 B3
3. (0x4c ^ 0xff) <<8 = 00 00 B3 00 //一定注意,. 这是16进制, 每一个数字表示4位 <<8 之后就是
00 00 B3 00
4 00 00 B3 00 + 00 00 00 4C = 00 00 B3 4C
算法2:
int dcode = 0x4C;
LogUtil.d("dcode" + dcode);
int rcode = ~dcode << 8; // 求4C的反码, 然后右移8位
int userCode = dcode + rcode;
LogUtil.d("userCode " + (userCode & 0xffff));
LogUtil.d("0xB34C " + 0xB34C); //最后的结果验证
0. 一个int 是32位, 四个字节 十六进制表示: 00 00 00 00
1. 0x4c =
内存中 00 00 00 4C
2. ~0x4c 内存中 FF FF FF B3
3. ~0x4c << 8 内存中 FF FF B3 00
4. dcode + rcode = FF FF B3 4C
5. ( dcode + rcode) & 0xFFFF = 0000 B3 4C