在 Swift 中,常用的二进制数据处理方法主要包括以下几种:
1、将字符串转换为二进制数据 (Data):可以使用 data(using:) 方法。
2、将整数或浮点数转换为二进制数据 (Data):可以通过 withUnsafeBytes、Data 初始化器等方式。
3、JSON 转换为二进制:通过 JSONSerialization.data 来实现。
下面是一些常见的二进制转换示例:
1、字符串转换为二进制 (Data)
可以将字符串通过 UTF-8 编码为 Data 类型的二进制数据:
import Foundation
let text = "Hello, Swift!"
if let binaryData = text.data(using: .utf8) {
print(binaryData) // 打印二进制数据
}
或使用Data(input.utf8)方法直接转换:
let input = """
{
"name": "Taylor Swift",
"address": {
"street": "555, Taylor Swift Avenue",
"city": "Nashville"
}
}
"""
let data = Data(input.utf8)
2、数字类型转换为二进制 (Data)
通过 Data 的初始化器来处理整数和浮点数的二进制转换:
// Int 转换为 Data
var number = 42
let intData = Data(bytes: &number, count: MemoryLayout.size(ofValue: number))
print(intData) // 输出为二进制形式
// Float 转换为 Data
var floatNumber: Float = 3.14
let floatData = Data(bytes: &floatNumber, count: MemoryLayout.size(ofValue: floatNumber))
print(floatData) // 输出为二进制形式
3、JSON 转换为二进制
JSONSerialization.data 用于将 JSON 对象(如 Dictionary 或 Array)编码为二进制格式:
let jsonObject: [String: Any] = ["name": "Alice", "age": 30]
do {
let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: [])
print(jsonData) // 打印 JSON 数据的二进制表示
} catch {
print("Error encoding JSON: \(error)")
}
withJSONObject 参数
withJSONObject 是要编码的数据对象,即将被转换成 JSON 的内容。在 Swift 中,这通常是一个 字典 ([String: Any]) 或 数组 ([Any]) ,它们包含要编码为 JSON 格式的数据。
options 参数
options 是一个 JSONSerialization.WritingOptions 类型,用来控制 JSON 数据的输出格式。常见的值有:
.prettyPrinted:将 JSON 格式化为更加易读的格式(添加换行符和缩进)。通常用于调试或日志输出,而不是用于网络传输。
.sortedKeys:将 JSON 中的键按字母顺序排列。这个选项可以在生成 JSON 文件时帮助保持键的顺序一致性。
默认情况下(options: []),JSON 数据会生成紧凑的格式,没有空格或换行符,以减少数据大小,便于网络传输。
let jsonObject: [String: Any] = ["name": "Alice", "age": 30]
do {
// 使用 .prettyPrinted 格式化输出
let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: [.prettyPrinted])
print(jsonData)
// 将 Data 转换回字符串便于查看
if let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString) // 格式化后的 JSON 字符串
}
} catch {
print("Error encoding JSON: \(error)")
}
运行此代码会将 JSON 数据格式化并按一定缩进显示,输出更便于人眼阅读:
{
"name" : "Alice",
"age" : 30
}
使用 options: [] 则生成紧凑格式,没有任何缩进或换行。
4、自定义类型(如 Struct)转换为二进制
可以使用 Codable 协议,并结合 JSONEncoder 将自定义类型转换为二进制。
struct User: Codable {
let name: String
let age: Int
}
let user = User(name: "Alice", age: 30)
do {
let binaryData = try JSONEncoder().encode(user)
print(binaryData) // 打印 User 对象的二进制表示
} catch {
print("Error encoding User: \(error)")
}
这些方法可以处理 Swift 中大多数常见的二进制数据转换需求。
5、JSON数据转换二进制方法区别
Data(input.utf8) 方法
let input = """
{
"name": "Taylor Swift",
"address": {
"street": "555, Taylor Swift Avenue",
"city": "Nashville"
}
}
"""
let data = Data(input.utf8)
这种方法适用于你已经手动编写了 JSON 字符串的情况,并希望将该字符串转换为 Data 类型。这只是一个简单的字符串到 Data 的转换,并不检查 JSON 的有效性。因此,它不会验证你的字符串是否是有效的 JSON 格式,也不会对数据进行任何编码工作。
JSONSerialization.data(withJSONObject:options:) 方法
let jsonObject: [String: Any] = ["name": "Alice", "age": 30]
do {
let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: [])
print(jsonData) // 打印 JSON 数据的二进制表示
} catch {
print("Error encoding JSON: \(error)")
}
JSONSerialization.data(withJSONObject:options:) 是标准的 JSON 编码方法,适合将 Swift 的字典或数组等结构转换为 JSON 格式的 Data。此方法:
确保数据是有效的 JSON 格式,如果数据不符合 JSON 标准(例如,嵌套对象或类型不支持),则会抛出错误。
提供编码选项,允许对生成的 JSON 数据进行格式化。
为什么更常用第二种方法?
JSONSerialization.data(withJSONObject:options:) 更适合在数据处理时动态构建 JSON,因为它:
1、更安全和健壮:会验证和确保数据符合 JSON 格式。
2、减少手动错误:避免手动拼写 JSON 字符串造成的格式错误。
3、支持动态数据:适合数据是变量而非静态字符串的情况,可以灵活处理不同的数据类型(例如从服务器获取的数据)。 所以,如果你只是将一个已知的 JSON 字符串转换为 Data,Data(input.utf8) 很简洁。但如果需要确保 JSON 的格式正确并处理复杂的数据结构,JSONSerialization 是更好的选择。