有可能知道字符串是否在base64中编码?

时间:2015-03-03 06:32:43

标签: ios swift base64 qr-code

这很简单。

我正在创建一个用户必须扫描QR码的应用程序(基本上是一个base64编码的字符串),是否有任何方法可以在解码之前验证字符串是否在base64中编码并遵循以下流程:申请?

我的代码将负责:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

    if metadataObjects == nil || metadataObjects.count == 0 {
        qrCodeFrameView?.frame = CGRectZero
        return
    }

    let metadataObj = metadataObjects[0] as AVMetadataMachineReadableCodeObject

    if metadataObj.type == AVMetadataObjectTypeQRCode {
        let barCodeObject = videoPreviewLayer?.transformedMetadataObjectForMetadataObject(metadataObj as AVMetadataMachineReadableCodeObject) as AVMetadataMachineReadableCodeObject
        qrCodeFrameView?.frame = barCodeObject.bounds

        if metadataObj.stringValue != nil /* Verify that string is base 64 before continue */ {
            let decodedData = NSData(base64EncodedString: metadataObj.stringValue, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
            let decodedString = NSString(data: decodedData!, encoding: NSUTF8StringEncoding)
            println(decodedString)
        }

        /* More code */

    }
}

4 个答案:

答案 0 :(得分:11)

如果字符串包含有效,则无需提前检查 BASE-64。您只需检查返回值,当输入未被识别为有效Base-64时,nil

if let decodedData = NSData(base64EncodedString: someString, options: nil) {
    // ...
} else {
    println("Not Base64")
}

更新 Swift 4:

if let decodedData = Data(base64Encoded: someString) {
    // ...
} else {
    print("Not Base64")
}

答案 1 :(得分:2)

您可以使用正则表达式检查字符串是否匹配base64编码,如下所示:

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$

在base64编码中,字符集为[A-Z,a-z,0-9和+ /],如果休息长度小于4,则填充'='字符。

^([A-Za-z0-9+/]{4})*表示字符串以0或更多时间的base64组开始。

([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)表示字符串必须以[A-Za-z0-9+/]{4}[A-Za-z0-9+/]{3}=[A-Za-z0-9+/]{2}==

中的3个表单结尾

基本规则是:

  • 检查长度是4个字符的倍数
  • 检查每个字符是否在集合A-Z,a-z,0-9,+,/中 最后填充为0,1或2'='字符

答案 2 :(得分:0)

请使用For Base64 Validation

OtherWise在项目pod 'SwiftValidators'

中添加Pod

实施例

if Validators.isBase64()("mnbzcxmnbnzzxmnb==")
{
print("Validate Yes")
}
else
{
print("Not Validate")
}

答案 3 :(得分:0)

您可以创建一个字符串扩展名来对此进行验证,并使用guard或简单的扩展名

  extension String
  {
    func isStringBase64() -> Bool {
        guard Data(base64Encoded: self) != nil else {
            return false
        }
        return true
    }
}