You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:06:04