Comment puis-je écrire des bits dans un flux (System.IO.Stream) ou lire en C#? Merci.Comment écrire/lire des bits de/vers un flux? (C#)
Répondre
Vous pouvez créer une méthode d'extension sur Stream qui énumère les bits, comme ceci:
public static class StreamExtensions
{
public static IEnumerable<bool> ReadBits(this Stream input)
{
if (input == null) throw new ArgumentNullException("input");
if (!input.CanRead) throw new ArgumentException("Cannot read from input", "input");
return ReadBitsCore(input);
}
private static IEnumerable<bool> ReadBitsCore(Stream input)
{
int readByte;
while((readByte = input.ReadByte()) >= 0)
{
for(int i = 7; i >= 0; i--)
yield return ((readByte >> i) & 1) == 1;
}
}
}
En utilisant cette méthode d'extension est facile:
foreach(bool bit in stream.ReadBits())
{
// do something with the bit
}
Neat en utilisant des méthodes d'extension. Cependant, vous pouvez ajouter un support pour lire les bits dans l'ordre inverse. –
Cela n'est pas possible avec la classe de flux par défaut. La classe de flux C# (BCL) fonctionne sur la granularité des octets à son niveau le plus bas. Ce que vous pouvez faire est d'écrire une classe wrapper qui lit les octets et les partage en bits.
Par exemple:
class BitStream : IDisposable {
private Stream m__stream;
private byte? m_current;
private int m_index;
public byte ReadNextBit() {
if (!m_current.HasValue) {
m_current = ReadNextByte();
m_index = 0;
}
var value = (m_byte.Value >> m_index) & 0x1;
m_index++;
if (m_index == 8) {
m_current = null;
}
return value;
}
private byte ReadNextByte() {
...
}
// Dispose implementation omitted
}
Note: Ceci lit les bits droit à la mode gauche qui peut ou peut ne pas être ce que vous avez l'intention.
Y a-t-il une bibliothèque pour ça? –
@Alon, je viens d'ajouter un exemple rapide sur la façon de le faire – JaredPar
Pouvez-vous ajouter un exemple pour écrire des bits, s'il vous plaît? –
- 1. chaînage des flux C++
- 2. Comment écrire des bits dans un fichier?
- 3. Flux C++ Boost io, gestion des erreurs
- 4. Comment analyser un flux
- 5. Comment enregistrer un flux RTMP?
- 6. C# - Comment lire un flux continu de XML sur HTTP
- 7. Comment accéder à un flux audio en utilisant DirectShow.NET C#
- 8. Flux d'octets C++
- 9. Comment convertir un IplImage * OpenCV 8 bits en un IplImage * 32 bits?
- 10. Comment convertir un flux en octet [] en C#?
- 11. Renvoyer un tableau en recherchant des bits?
- 12. Comment analyser un flux vidéo
- 13. Exposer des données dans un flux d'atomes
- 14. Comment combiner des colonnes de 2 bits
- 15. comment mélanger plusieurs flux vidéo en un seul flux?
- 16. directive C# pour indiquer 32 bits ou 64 bits construire
- 17. Flux C++ vers la mémoire
- 18. Comment insérer des marqueurs dans un flux vidéo Silverlight LIVE?
- 19. Inverser un flux RSS
- 20. manipulation de champs dans un tableau de bits en C++
- 21. Convertir des octets en bits
- 22. Problème C++ Stuffing 8 bits dans un char
- 23. Gestion des flux RSS
- 24. Clearcase UCM: comment trouver des versions dans le flux A créé en fusionnant du flux B
- 25. Comment créer un flux Zend correctement?
- 26. Comment enregistrer une DLL 64 bits (sur un système d'exploitation 64 bits) à partir d'une application 32 bits
- 27. Comment dédoubler des flux d'événements parallèles
- 28. Comment créer un flux de jpegs (live) en C++ ou C# ou java? RTSP?
- 29. Chargement d'un processus 32 bits dans un environnement 64 bits
- 30. Ressources pour travailler avec des flux vidéo en C#
Pouvez-vous fournir un peu plus de contexte? Voulez-vous dire lire/écrire des données binaires par opposition aux données de texte? Quel type de données avez-vous l'intention de lire/écrire? –
Voulez-vous vraiment écrire des bits simples (pas des octets)? –
La question est limpide, qu'il a besoin d'écrire ou de lire un seul bit à la fois vers/depuis un flux. Ceci est typique pour l'écriture de flux compacts ou la compression Huffman. –