iOS 中默认的 Base64 规范(RFC 4648)

在 iOS 中,在使用 base64 时,我们经常这样使用:

// data 是 NSData 类型
[data base64EncodedStringWithOptions:0];
typedef NS_OPTIONS(NSUInteger, NSDataBase64EncodingOptions) {
    // Use zero or one of the following to control the maximum line length after which a line ending is inserted. No line endings are inserted by default.
    NSDataBase64Encoding64CharacterLineLength = 1UL << 0,
    NSDataBase64Encoding76CharacterLineLength = 1UL << 1,

    // Use zero or more of the following to specify which kind of line ending is inserted. The default line ending is CR LF.
    NSDataBase64EncodingEndLineWithCarriageReturn = 1UL << 4,
    NSDataBase64EncodingEndLineWithLineFeed = 1UL << 5,
}

默认情况下,不插入行结束符。

By default, no line endings are inserted.

如果你指定了其中一个行长度选项(NSDataBase64Encoding64CharacterLineLength或NSDataBase64Encoding76CharacterLineLength),但没有指定要插入的行结束符的类型,默认的行结束符是回车+换行。

If you specify one of the line length options (NSDataBase64Encoding64CharacterLineLength or NSDataBase64Encoding76CharacterLineLength) but don’t specify the kind of line ending to insert, the default line ending is Carriage Return + Line Feed.

  • NSDataBase64Encoding64CharacterLineLength

设置最大的行长度为64个字符,之后插入行结束符。
Set the maximum line length to 64 characters, after which a line ending is inserted.

  • NSDataBase64Encoding76CharacterLineLength

将最大行长设置为76个字符,之后插入行结束符。
Set the maximum line length to 76 characters, after which a line ending is inserted.

  • NSDataBase64EncodingEndLineWithCarriageReturn

当设置了最大行长时,指定要插入的行结尾应包含回车。
When a maximum line length is set, specify that the line ending to insert should include a carriage return.

  • NSDataBase64EncodingEndLineWithLineFeed

当设置了最大行长时,指定要插入的行结尾应该包含换行符。
When a maximum line length is set, specify that the line ending to insert should include a line feed.

从维基上看,base64 有多个规范,可以很容易看出 NSDataBase64Encoding64CharacterLineLength 符合 RFC 1421


image.png

但是 iOS 开发中绝大多数时候,都没有指定 base64 类型,而是传了一个0,使用系统默认

// data 是 NSData 类型
[data base64EncodedStringWithOptions:0];

而对于默认base64的行为,苹果的开发文档里只有一句话:

默认情况下,不插入行结束符。

但这可以从苹果的《AppStore 收据验证编程指南》考证,iOS 里默认 base64 规范符合:RFC 4648。

和 Go 语言 base64 默认的标准一致。

image.png

image.png

参考:

推荐阅读更多精彩内容