【发布时间】:2015-02-19 18:51:37
【问题描述】:
情况
我正在处理中间有一个字符串编码的二进制数据。我想要做的是提取这个字符串,以便我可以“设置”和“获取”它。我想出了一个看起来有点时髦的方法(实际上是 3 个选项)。我已经包含了一个游乐场代码,您可以查看它。
我想知道是否有比我想出的“更好”的方法来处理这些数据。更好意味着更高效或更清晰的代码。
要读取数据,我执行以下操作 -
- 通过将
NSMutableData转换为UnsafeMutablePoitner<UInt8>来生成var rawData - 从
rawData.mutableBytes创建var ptr : UnsafeMutablePointer<UInt8> - 从第一个两个变量的组合中创建
UnsafeMutableBufferPointer<UInt8>类型的数组bytes - 创建一个新数组,仅由包含字符串
bytes[19]-bytes[26]的字节组成 - 将此数组提取为字符串
然后设置变量我有 3 种方法,但我认为我会使用的方法是
1. 新建一串8串
2.创建[UInt8]字符串的字符数组
3.循环遍历新数组中的每个字节,并将bytes数组中字节的值设置为有问题的值
我假设有某种方法可以直接使用“父”字节数组,而不是制作子数组来使用。操场代码如下。我正在寻找一种更清洁的方法来做到这一点,也许没有。
谢谢
游乐场代码
import Cocoa
//import AppKit
///This is the raw data
var testBytes : [UInt8] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15, 0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0, 0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56, 0x20, 0x20, 0x20, 0x00]
///Convert into msgData
var msgData = NSMutableData(bytes: testBytes, length: testBytes.count)
// Store raw data into a byte array for messing with
var rawData: NSMutableData = NSMutableData(data: msgData)
var ptr: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8>(rawData.mutableBytes)
var bytes : UnsafeMutableBufferPointer<UInt8> = UnsafeMutableBufferPointer<UInt8>(start: ptr, count: rawData.length)
// Extract Callsign from the data stream
var callsignArray : [UInt8] = [bytes[19], bytes[20], bytes[21], bytes[22], bytes[23], bytes[24], bytes[25], bytes[26]]
var callsignString = NSString(bytes: callsignArray, length: callsignArray.count, encoding: NSUTF8StringEncoding)
let callsignString0 = callsignString!
println(callsignArray)
println("1. -- Initial Callsign [\(callsignString0)]")
//OPTION #1
// Edit Callsgin Array Directly (sketchy)
// And manually copy the bytes back into the base array
callsignArray[0] = 97
callsignArray[1] = 98
callsignArray[2] = 99
callsignArray[3] = 100
println(callsignArray)
// Write the new "bytes" back into the main array - there must be a better way
for (var i = 0; i <= 7; i++) {
bytes[19+i] = callsignArray[i]
}
let callsign1 = NSString(bytes: callsignArray, length: callsignArray.count, encoding: NSUTF8StringEncoding)!
println("2. -- Modification of Bytes [\(callsign1)]")
//Option 3 - Go from String to Bytes
let callsign3 = "AABCDEF "
var buf = [UInt8](callsign3.utf8)
for (var i = 0; i <= 7; i++) {
bytes[19+i] = buf[i]
}
println(rawData)
callsignArray = [bytes[19], bytes[20], bytes[21], bytes[22], bytes[23], bytes[24], bytes[25], bytes[26]]
callsignString = NSString(bytes: callsignArray, length: callsignArray.count, encoding: NSUTF8StringEncoding)
【问题讨论】:
标签: arrays string swift nsdata