reactnative-camera所用ML Kit Barcode Scanner遇NULL字节截断内容如何解决
问题解答
核心结论
你可以通过解析rawData获取完整的二维码二进制内容,完全不受displayValue空字节截断问题的影响。displayValue是ML Kit将原始字节按默认文本编码(UTF-8/ASCII)转换得到的可读字符串,C风格字符串遇到U+0000空字节就会自动截断,属于正常的字符串特性,并非扫描逻辑丢失了数据。
rawData编码规则
ML Kit原生返回的rawData本身是无编码的纯原始二进制字节流,和二维码存储的原始字节完全一致:
- iOS端原生
MLKBarcode.rawData为NSData类型,直接存储扫描得到的全量字节,无额外转码 - Android端原生
Barcode.getRawBytes()为byte[]类型,同样是二维码的原始字节序列
你当前拿到的十六进制内容不符合预期,是react-native-camera的桥接层导致的:该库默认会将原生的二进制字节按UTF-8编码转换为JS字符串后再转十六进制,遇到空字节、不可打印字符时会出现转码错误,导致最终结果损坏。
修复方案
修改react-native-camera的原生桥接逻辑,在原生层直接将rawData转换为十六进制字符串后再传递给JS层,跳过中间的UTF-8转码步骤即可拿到正确的全量十六进制内容。
iOS端转换代码示例
- (NSString *)rawDataToHexString:(NSData *)rawData { const unsigned char *byteBuffer = (const unsigned char *)rawData.bytes; NSMutableString *hexResult = [NSMutableString stringWithCapacity:rawData.length * 2]; for (NSUInteger i = 0; i < rawData.length; i++) { [hexResult appendFormat:@"%02hhx", byteBuffer[i]]; } return hexResult; }
Android端转换代码示例
private String rawBytesToHexString(byte[] rawBytes) { StringBuilder hexBuilder = new StringBuilder(); for (byte b : rawBytes) { String hexSeg = Integer.toHexString(0xFF & b); if (hexSeg.length() == 1) hexBuilder.append('0'); hexBuilder.append(hexSeg); } return hexBuilder.toString(); }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

