objective-c - 无法使用 AVFoundation 读取带有 ASCII 字符的 QR 码
问题描述
-(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;
}
}}
在这里我可以读取普通的二维码。但是 [metadataObj stringValue] 在从 QR 码读取 ASCII 字符时返回 nil。我用它来加密二维码中的数据,这样只有我的应用程序才能读取我的二维码。如何读取 ASCII 字符?这是我的加密二维码二维码图片
解决方案
Apple 的 SDK 仅使用 UTF8 编码进行转换并不让我感到惊讶。
在旧的 iTunes 上下载该应用程序并进行探索后,我发现了一些参考资料ZXingObjc
,ZBarSDK
我猜这些资料是用来读取 QRCode 的,这可以解释为什么该应用程序可以读取它而你的却不能。
因此,您可以使用这些第三方库,或者如果您想继续使用 Apple 的库,这里有一个可能的解决方案:
NSString <=> EncryptedString <=> Base64EncryptedString <=> QRCode
或者等待 Apple 提供而不是只提供[metadataObj stringValue]
, [metadataObj stringValueUsingEncoding:]
, or [metadataObj rawData]
(你可以在使用之后[[NSString alloc] initWithData:[metadataObj rawData] encoding:NSASCIIEncoding]
)。
推荐阅读
- android - 如何在android中调用REST API之前刷新JWT令牌?(改造,Rx)
- python - ORA-01830(在本地运行,但在服务器上抛出错误)
- sql-server - 引用表“hotel”中没有与外键“fk_rooms_hotel”中的引用列列表匹配的主键或候选键
- pyspark - 将带美元符号的字符串转换为数字
- http - 获取 Http 400 错误请求 - 通过 IP 而不是 DNS 调用 IIS 站点时主机名无效
- javascript - 如何告诉打字稿接受空数组或函数
- sas - 错误:%EVAL 函数的参数中缺少 IN 运算符的操作数
- java - 没有明确的错误日志,Apache Solr 无法启动
- javascript - 为什么列表不显示在页面上
- python - 在熊猫中按行计算相关系数