【问题标题】:Cannot read QR Code with ASCII characters using AVFoundation无法使用 AVFoundation 读取带有 ASCII 字符的 QR 码
【发布时间】:2018-05-25 01:40:12
【问题描述】:
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
unsigned char myKey[2];
myKey[0]=1;
myKey[1]=2;
if(metadataObjects == nil  || [metadataObjects count] ==0)
{
    qrCodeFrameView.frame=CGRectZero;
}
if (metadataObjects != nil && [metadataObjects count] > 0) {
    AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
    if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
        Encoder *encoder=[[Encoder alloc] init];
        NSLog(@"0000-----%@",[metadataObj stringValue]);
        unsigned char buffer_to_decrypt=[metadataObj stringValue];
        [encoder tripledes_decrypt:buffer_to_decrypt lenght:sizeof(buffer_to_decrypt) key:myKey];
        NSData *data = [NSData dataWithBytes:buffer_to_decrypt length:sizeof(buffer_to_decrypt)];
        NSLog(@"data = %@", data);
        NSString *result=[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSLog(@"-----<<<<result>>>>%@",result);
        AVMetadataMachineReadableCodeObject *barCodeObj=(AVMetadataMachineReadableCodeObject *)[_videoPreviewLayer transformedMetadataObjectForMetadataObject:metadataObj];
        qrCodeFrameView.frame=barCodeObj.bounds;
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
        [self stopReading];
        _isReading = NO;
    }
}}

在这里我可以读取普通的二维码。但是从 QR 码读取 ASCII 字符时,[metadataObj stringValue] 返回 nil。我用它来加密二维码中的数据,这样只有我的应用程序才能读取我的二维码。如何读取 ASCII 字符? 这是我的加密二维码QR Code image

【问题讨论】:

  • 下载了你使用的可以阅读的应用程序(QR Bot)后,它似乎使用了ZBarSDK & ZXingObjc。我想这就是使它起作用的那个。 Apple 的只读 UTF8 不会让我感到惊讶。所以一个解决方案可能是base64转换它?然后它应该是 UTF8 兼容的,并且可以再次根据您的需要进行翻译(转换为加密的,然后您使用所需的编码 ASCII 进行解码)。
  • 是的,它成功了,非常感谢@Larme !!!现在我很欣赏 base64 :-)

标签: objective-c qr-code


【解决方案1】:

Apple 的 SDK 仅使用 UTF8 编码进行转换并不让我感到惊讶。

在旧的 iTunes 上下载该应用程序并进行探索后,我发现了对 ZXingObjcZBarSDK 的引用,我猜它们是用来读取二维码的,这可以解释为什么应用程序可以读取它而你的不能.

所以您可以使用这些第三方库,或者如果您想继续使用 Apple 的库,这里有一个可能的解决方案:

NSString <=> EncryptedString <=> Base64EncryptedString <=> QRCode

或者等待 Apple 提供而不是仅提供 [metadataObj stringValue][metadataObj stringValueUsingEncoding:][metadataObj rawData](您可以在使用 [[NSString alloc] initWithData:[metadataObj rawData] encoding:NSASCIIEncoding] 之后提供)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 2016-02-22
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多