2017-06-28 5 views
0

Ich versuche eine protobuff codierte Nachricht zu dekodieren, also muss ich das erste Byte (den Schlüssel) in der Protobuff Nachricht in Bits konvertieren, damit ich die Feldnummer finden kann. Wie konvertiere ich ein UInt8 (das Byte) in ein Array von Bits?Swift - Konvertiere UInt8 Byte in Array von Bits

Pseudo-Code

private func findFieldNum(from byte: UInt8) -> Int { 
    //Byte is 0001 1010 
    var fieldNumBits = byte[1] ++ byte[2] ++ byte[3] ++ byte[4] //concatentates bits to get 0011 
    getFieldNum(from: fieldNumBits) //Converts 0011 to field number, 2^1 + 2^0 = 3 
} 

Ich sah this question, die eine Reihe von Bits in Array von Bytes umwandelt.

Antwort

4

Hier ist eine Grundfunktion einen Bit Array aus einem Byte zu erhalten:

func bits(fromByte byte: UInt8) -> [Bit] { 
    var byte = byte 
    var bits = [Bit](repeating: .zero, count: 8) 
    for i in 0..<8 { 
     let currentBit = byte & 0x01 
     if currentBit != 0 { 
      bits[i] = .one 
     } 

     byte >>= 1 
    } 

    return bits 
} 

Hier ist Bit ein benutzerdefinierter Aufzählungstyp, die ich definiert haben, wie folgt:

enum Bit: UInt8, CustomStringConvertible { 
    case zero, one 

    var description: String { 
     switch self { 
     case .one: 
      return "1" 
     case .zero: 
      return "0" 
     } 
    } 
} 

Mit Dieses Setup, die Ausgabe des folgenden Codes:

let byte: UInt8 = 0x1f 

print(bits(fromByte: byte)) 

wäre:

[1, 1, 1, 1, 1, 0, 0, 0] 
+0

Haben Sie ein Byte als hexadezimale zu schreiben oder ist es möglich, sie als binäre wie 00.011.010 zu schreiben? – Amanda

+0

Sie können mit dem Suffix '0b' binär schreiben. z.B. '0b10001111' – mohak

0

Sie können einige bitweise Operationen ausführen, um den Wert der Bits bei den Indizes 1-4 zu erhalten.

// An example byte 
let a: UInt8 = 0b00011010 

// Extract the bits (using 0b01111000 as a bitmask) 
// in indices 1 to 4, then shift right by 3 places 
// to remove indices 5 to 7 
var b = (a & 0b01111000) >> 3 

// In this case, b is now 3 (or 11 in binary) 
print(b) 
Verwandte Themen