2017-06-28 4 views
0

J'essaye de décoder un message encodé en protobuff, donc j'ai besoin de convertir le premier octet (la clé) du message de protobuff en bits, donc je peux trouver le numéro de champ. Comment puis-je convertir un UInt8 (l'octet) en un tableau de bits?Swift - Convertit un octet UInt8 en un tableau de bits

code pseudo

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 
} 

je vis this question, qui convertit un ensemble de bits dans un tableau d'octets.

Répondre

4

est ici une fonction de base pour obtenir un tableau Bit d'un octet:

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 
} 

Ici, Bit est un type enum personnalisé que je l'ai défini comme suit:

enum Bit: UInt8, CustomStringConvertible { 
    case zero, one 

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

Avec cette configuration, la sortie du code suivant:

let byte: UInt8 = 0x1f 

print(bits(fromByte: byte)) 

serait:

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

Avez-vous d'écrire un octet en hexadécimal ou est-il possible d'écrire comme un binaire comme 00.011.010? – Amanda

+0

Vous pouvez écrire en binaire avec le suffixe '0b'. par exemple. '0b10001111' – mohak

0

Vous pouvez effectuer quelques opérations au niveau du bit pour obtenir la valeur des bits aux indices 1-4.

// 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)