Ich habe eine List<bool>
, die ich in eine byte[]
umwandeln möchte. Wie mache ich das?
list.toArray()
erstellt ein bool[]
.
Hier sind zwei Ansätze, je nachdem, ob Sie die Bits in Bytes packen möchten oder so viele Bytes wie die ursprünglichen Bits haben:
%Vor%Unter der Annahme, dass Sie die Art von Person sind, die mit Bit-Twiddling vertraut ist, oder einfach weniger Code schreiben möchte und etwas mehr Leistung herausquetscht, dann diesen Code hier ist für dich gut, Herr / Frau:
%Vor%Es macht genau dasselbe wie Marc's Code, es ist nur knapper.
Natürlich, wenn wir wirklich alles rausgehen wollen, könnten wir es auch ausrollen ...
... und während wir dabei sind, werfen wir einen Kurvenkugel auf den Rückgabetyp!
Tipp: Wie Sie sehen können, habe ich den Code für die Rückgabe eines byte[]
als Kommentar eingefügt. Kommentieren Sie einfach die beiden yield-Anweisungen, wenn Sie das wollen / brauchen.
Twiddling-Tipps:
Shifting x >> 3
ist ein billiger x / 8
.
Masking x & 0x07
ist ein billiger x % 8
.
Masking x & ~0x07
ist ein billiger x - x % 8
.
Bearbeiten: Hier ist eine Beispieldokumentation:
%Vor%Wenn Sie irgendeine Kontrolle über den Listentyp haben, versuchen Sie, ihn zu einer Liste zu machen, die dann das Byte [] in ToArray () erzeugt. Wenn Sie eine ArrayList haben, können Sie Folgendes verwenden:
%Vor%Um die Liste zu erhalten, könnten Sie eine mit Ihrem nicht spezifizierten Listeniterator als Eingabe für den Konstruktor erstellen und dann die ToArray ()? Oder kopiere jedes Element, indem du von bool auf ein neues Byte wirfst?
Einige Informationen über die Art der Liste könnten helfen.
Sehen Sie sich die BitConverter -Klasse an. Abhängig von der genauen Art Ihrer Anforderung, kann es Ihr Problem ziemlich sauber lösen.
Ein anderer LINQ-Ansatz, der weniger effektiv ist als @ hfcs101, aber auch für andere Werttypen geeignet wäre:
%Vor% Oder der Ansatz von IEnumerable
zu AnorZakens Antwort :
Und das entsprechende Entpacken, wobei paddingEnd
die Anzahl der Bits bedeutet, die vom letzten zu entpackenden Byte zu verwerfen sind: