¿Cómo puedo escribir bits en una secuencia (System.IO.Stream) o leer en C#? Gracias.¿Cómo escribir/leer bits desde/hacia un flujo? (C#)
Respuesta
podría crear un método de extensión de corriente que enumera los bits, así:
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;
}
}
}
El uso de este método de extensión es fácil:
foreach(bool bit in stream.ReadBits())
{
// do something with the bit
}
Limpio usando métodos de extensión. Sin embargo, puede agregar soporte para leer bits en orden opuesto. –
Esto no es posible con la clase de transmisión predeterminada. La clase de flujo C# (BCL) opera en la granularidad de bytes en su nivel más bajo. Lo que puede hacer es escribir una clase contenedora que lea bytes y particione en bits.
Por ejemplo:
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
}
Nota: Esto leer los bits derecho a la moda izquierda, que pueden o no ser lo que usted está con la intención.
¿Hay una biblioteca para eso? –
@Alon, acabo de agregar una muestra rápida sobre cómo hacer eso – JaredPar
¿Puede agregar un ejemplo para escribir bits, por favor? –
- 1. Cómo escribir un flujo de bits
- 2. C# - pregunta de flujo
- 3. Cómo sustituir bits en un campo de bits sin afectar a otros bits utilizando c
- 4. Conversión de flujo de entrada en mapa de bits
- 5. Android: Transforme un mapa de bits en un flujo de entrada
- 6. Algoritmo de redundancia para leer el flujo de bits ruidoso
- 7. Generar un gif blanco 1x1 como un flujo en C#
- 8. ¿Cómo escribir un flujo en un archivo?
- 9. Convierta un flujo a un FileStream en C#
- 10. ¿Cambios de bits en un puntero C?
- 11. ¿Cómo compilar un programa C++ como de 64 bits en una máquina de 64 bits?
- 12. Cómo invertir en bits AND (&) en C?
- 13. ¿Cómo hacer fsync en un flujo?
- 14. ¿Cómo leer un flujo en otro?
- 15. vectores de bits en C++
- 16. ¿Es posible generar un flujo de bits en JS para una fuente de video HTML5?
- 17. ¿Cómo puedo separar una secuencia de un lector de flujo o un escritor de flujo?
- 18. Problemas con interfaz de flujo en C++
- 19. ¿Cómo implemento una matriz de bits en C/Objetivo C
- 20. Rotación de bits en C
- 21. Flujo de C++ como variable miembro
- 22. C++ cadena de flujo es demasiado lento, ¿cómo acelerar?
- 23. Campos de bits en C#
- 24. Bits de configuración en C
- 25. Bits de acceso en un carácter en C
- 26. C/C++ matriz de bits eficiente
- 27. ¿Qué es un mapa de bits en C?
- 28. C++ manipulador de flujo a medida que cambia siguiente punto del flujo de
- 29. Obtener un flujo de un XmlReader
- 30. Arreglo de bits en C++
¿Puede dar un poco más de contexto? ¿Quiere decir leer/escribir datos binarios en lugar de datos de texto? ¿Qué tipo de datos es lo que intentas leer/escribir? –
¿Realmente quieres escribir bits individuales (no bytes)? –
La pregunta es clara como el cristal, que necesita escribir o leer un bit a la vez desde/hacia una secuencia. Esto es típico para escribir secuencias compactas o compresión Huffman. –