有可能知道字符串是否以 base64 编码?
It is possible to know if a string is encoded in base64?
就这么简单。
我正在制作一个应用程序,用户必须在其中扫描二维码(基本上是一个 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 */
}
}
您可以使用正则表达式来检查字符串是否匹配 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 个“=”字符
不需要提前检查字符串是否包含有效
Base-64。您只需要检查 return 值,当输入未被识别为有效的 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")
}
否则在项目中添加 Pod pod 'SwiftValidators'
例子
if Validators.isBase64()("mnbzcxmnbnzzxmnb==")
{
print("Validate Yes")
}
else
{
print("Not Validate")
}
您可以创建一个字符串扩展来验证这一点并使用 guard
或者一个简单的 if 也可以
extension String
{
func isStringBase64() -> Bool {
guard Data(base64Encoded: self) != nil else {
return false
}
return true
}
}
就这么简单。
我正在制作一个应用程序,用户必须在其中扫描二维码(基本上是一个 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 */
}
}
您可以使用正则表达式来检查字符串是否匹配 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 个“=”字符
不需要提前检查字符串是否包含有效 Base-64。您只需要检查 return 值,当输入未被识别为有效的 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")
}
否则在项目中添加 Pod pod 'SwiftValidators'
例子
if Validators.isBase64()("mnbzcxmnbnzzxmnb==")
{
print("Validate Yes")
}
else
{
print("Not Validate")
}
您可以创建一个字符串扩展来验证这一点并使用 guard
或者一个简单的 if 也可以
extension String
{
func isStringBase64() -> Bool {
guard Data(base64Encoded: self) != nil else {
return false
}
return true
}
}