Swift 常用的二进制转换方法
Swift 常用的二进制转换方法

Swift 常用的二进制转换方法

在 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 是更好的选择。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注