簡體   English   中英

基於NSData子集的Swift NSData字符串轉換

[英]Swift NSData String Conversion Based on Subset of NSData

情況

我正在使用二進制數據,該數據的中間編碼有一個字符串。 我想做的是提取此字符串,以便可以“設置”和“獲取”它。 我想出了一種看起來有點時髦的方法(實際上是3種選擇)。 我提供了一個游樂場代碼,您可以查看。

我想知道是否有比我提出的更好的方法來處理這些數據。 更好意味着更高效或更清晰的代碼方式。

要讀取數據,請執行以下操作-

  1. 通過將NSMutableData轉換為UnsafeMutablePoitner<UInt8>來制作var rawData
  2. rawData.mutableBytes創建var ptr : UnsafeMutablePointer<UInt8>
  3. 從第一個兩個變量的組合創建類型為UnsafeMutableBufferPointer<UInt8>的數組bytes
  4. 創建一個僅由包含字符串bytes[19] bytes[26]的字節組成的新數組
  5. 將此數組提取為字符串

然后設置變量,我有3種方法,但我認為我會使用的一種方法:1.制作一個8字符串的新字符串2.創建字符串的字符的[UInt8]數組3.遍歷新數組中的每個字節並將bytes數組中byte的值設置為有問題的值

我假設有某種方法可以直接使用“父”字節數組,而不是使用子數組。 游樂場代碼如下。 我正在尋找一種更清潔的方式來執行此操作,也許沒有。

謝謝

游樂場代碼

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)

NSMutableData具有提取和替換子范圍的方法:

// Get: 
let subData = msgData.subdataWithRange(NSMakeRange(19, 8))
let string = NSString(data: subData, encoding: NSUTF8StringEncoding)

// Set:
let newString = "AABCDEF "
let newData = newString.dataUsingEncoding(NSUTF8StringEncoding)!
msgData.replaceBytesInRange(NSMakeRange(19, 8), withBytes: newData.bytes, length: newData.length)

您也可以直接在[UInt8]數組上進行操作:

// Get:
let string = testBytes.withUnsafeBufferPointer {
    NSString(bytes: UnsafePointer($0.baseAddress + 19), length: 8, encoding: NSUTF8StringEncoding)
}

// Set:
testBytes.replaceRange(19 ... 26, with: Array(newString.utf8))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM