Android(Java)与C#读取同-NFC标签Payload字节不一致求助
解决Android(Java)与C#读取NFC标签Payload字节数组不一致的问题
这是典型的有符号/无符号字节类型差异导致的显示问题,核心原因:
- Java的
byte是有符号8位整数,取值范围为-128到127;当原始二进制值大于127时,会以负数形式显示(计算方式:数值 - 256)。 - C#的
byte是无符号8位整数,取值范围为0到255,所有二进制值都以正数形式显示。
你的两个数组底层二进制内容完全一致,只是数值的表示方式不同,关键值对应关系如下:
| C#无符号byte | Java有符号byte | 转换逻辑 |
|---|---|---|
| 209 | -47 | 209-256=-47 |
| 170 | -86 | 170-256=-86 |
| 251 | -5 | 251-256=-5 |
| 128 | -128 | 128-256=-128 |
要让两边数据处理逻辑一致,只需要统一数值表示方式即可:
方案1:Java端转为无符号数值处理
将Java的有符号byte转换为无符号int,得到和C#完全一致的数值:
byte[] rawPayload = msgs[0].toByteArray(); int[] unsignedPayload = new int[rawPayload.length]; for (int i = 0; i < rawPayload.length; i++) { // 与0xFF按位与,保留无符号数值 unsignedPayload[i] = rawPayload[i] & 0xFF; } // 此时unsignedPayload的数值与C#的rawMsg完全匹配
方案2:C#端转为有符号数值处理
将C#的无符号byte转换为有符号sbyte,得到和Java完全一致的数值:
byte[] rawMsg = message.Data.ToArray(); sbyte[] signedPayload = Array.ConvertAll(rawMsg, b => (sbyte)b); // 此时signedPayload的数值与Java的rawPayload完全匹配
无论选择哪种方案,只要后续业务逻辑基于统一的数值表示进行处理,就能保证两边的数据一致性。
内容的提问来源于stack exchange,提问作者Gabriel Palmeri
相关产品推荐
相关产品推荐

