Ich versuche, einige Binärdatei Parsing in Swift zu tun, und obwohl ich Dinge arbeiten, habe ich eine Situation, wo ich variable Felder haben.Ansatz zum Lesen einer beliebigen Anzahl von Bits in Swift
Ich habe alle meine Parsing im Standardfall arbeitet
Ich packe
1-bit field
1-bit field
1-bit field
11-bits field
1-bit field
(optional) 4-bit field
(optional) 4-bit field
1-bit field
2-bit field
(optional) 4-bit field
5-bit field
6-bit field
(optional) 6-bit field
(optional) 24-bit field
(junk data - up until byte buffer 0 - 7 bits as needed)
meisten Daten verwendet nur einen bestimmten Satz von optionals so habe ich weitergemacht und begann Klassen schreiben zu handhaben diese Daten. Mein allgemeiner Ansatz ist es, eine Zeigerstruktur zu erstellen und dann einen Byte-Array aus, dass konstruieren:
let rawData: NSMutableData = NSMutableData(data: input_nsdata)
var ptr: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8(rawData.mutableBytes)
bytes = UnsafeMutableBufferPointer<UInt8>(start: ptr, count: rawData.length - offset)
Also hast ich mit einer Reihe von [UInt8]
am Ende arbeiten und ich kann meine Analyse in ähnlicher Weise wie tun:
let b1 = (bytes[3] & 0x01) << 5
let b2 = (bytes[4] & 0xF8) >> 3
return Int(b1 | b2)
Also wo ich Probleme habe ist mit den optionalen Feldern, da meine Daten nicht speziell auf Bytegrenzen liegen wird alles kompliziert. In der idealen Welt würde ich wahrscheinlich nur direkt mit dem Zeiger arbeiten und ihn nach Bedarf um Bytes vorrücken, aber ich bin mir nicht bewusst, dass ich einen Zeiger um 3 Bits vorrücken kann - was mich zu meiner Frage
bringtWas ist der beste Ansatz, um mit meiner Situation umzugehen?
Eine Idee, die ich dachte, war mit verschiedenen Strukturen zu kommen, die die optionalen Felder widerspiegeln, außer dass ich nicht sicher bin, wie man Bit-ausgerichtete gepackte Strukturen erzeugt.
Was ist meine beste Vorgehensweise hier? Zur Klarstellung - die ersten 1-bit
Felder bestimmen, welche der optionalen Felder gesetzt sind.
Sofern Sie nicht ausdrücklich suchen Ihre eigene Implementierung zu entwerfen, würde ich einfach nutzen [CFBitVector] (https://developer.apple. com/bibliothek/mac/documentation/CoreFoundation/Referenz/CFBitVectorRef /). –
@SamR .: CFBitVector ist praktisch, um eine große Menge von Bits zu verwalten, aber - es sei denn, ich übersehen etwas - hilft nicht beim Abrufen einer Zahl, die in mehreren Bits gespeichert ist, vielleicht über Byte Grenzen. Es ist wahrscheinlich nicht sehr effektiv, alle Bits für ein Feld getrennt abzurufen und die Anzahl daraus zu bilden. –