是否可以知道一个字符串是否是用base64编码的?

5

就是这么简单。

我正在制作一个应用程序,用户必须扫描一个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个回答

13

不需要事先检查字符串是否包含有效的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")
}

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}==
基本规则如下:
- 检查长度是否为4的倍数。 - 检查每个字符是否在集合[A-Z,a-z,0-9,+ /]中,除了末尾的填充字符,可以是0个、1个或2个'='字符。

0
您可以创建一个字符串扩展来验证它,并利用 guard,或者简单的 if 语句也可以。
  extension String
  {
    func isStringBase64() -> Bool {
        guard Data(base64Encoded: self) != nil else {
            return false
        }
        return true
    }
}

根本不起作用。在我的情况下,我有一个字符串,我知道它是以base64编码的,当我尝试使用它进行检查时,它返回true。当我尝试使用一个没有以base64编码的字符串时,它仍然返回true...毫无用处... - lucgian841
@lucgian841,你能提供一下你尝试的字符串吗?因为当我使用一个简单的字符串比如“Hello World”时,它返回false,这意味着该字符串不是base64编码。正如你所看到的,我并没有做任何特殊处理,只是使用苹果自己的类进行验证。很想知道你用什么字符串尝试过? - NSDumb

0
请使用Base64验证
否则,请在项目中添加Pod pod 'SwiftValidators'
示例。
if Validators.isBase64()("mnbzcxmnbnzzxmnb==")
{
print("Validate Yes")
}
else
{
print("Not Validate")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接