【问题标题】:It is possible to know if a string is encoded in base64?有可能知道一个字符串是否用base64编码?
【发布时间】:2015-03-03 06:32:42
【问题描述】:

就这么简单。

我正在制作一个用户必须扫描 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 */

    }
}

【问题讨论】:

    标签: ios swift base64 qr-code


    【解决方案1】:

    如果字符串包含有效,则无需提前检查 基数 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,and + /],如果剩余长度小于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 个“=”字符

      【讨论】:

        【解决方案3】:

        请使用For Base64 Validation

        OtherWise 在项目中添加 Pod pod 'SwiftValidators'

        例子

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

        【讨论】:

          【解决方案4】:

          您可以创建一个字符串扩展来验证这一点并使用guard或一个简单的 if 也可以

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

          【讨论】:

          • 根本行不通。就我而言,当我尝试检查它时,我知道一个字符串以 base 64 编码,它返回 true。当我尝试使用未在 base 64 中编码的字符串时,它无论如何都会返回 true... 没用...
          • @lucgian841 你能给我你尝试的字符串吗,因为当我尝试使用像“Hello World”这样的简单字符串时,它返回false,这意味着字符串不是base64,正如你所看到的我我在这里没有做任何特别的事情,而是使用苹果自己的类来验证。想知道您用什么字符串尝试过它?
          猜你喜欢
          • 1970-01-01
          • 2019-08-03
          • 1970-01-01
          • 2013-02-20
          • 2019-06-17
          • 1970-01-01
          • 2012-09-01
          • 1970-01-01
          • 2012-01-24
          相关资源
          最近更新 更多