Tratamiento de bits en C#

24/05/2004 - 13:25 por Derfel | Informe spam
Hola a todos/as
Tengo que hacer un programa que interprete un fichero binario, este fichero
está compuesto por líneas de 139 bytes donde cada línea tiene:
8 bytes: Indican el número de elementos
6 bytes: Indican el año
20 bytes: El tiempo en minutos
8 bytes: Valor de entrada
4 bytes: Número de entradas
1 byte: Validez
32 bytes:
32 bytes:
6: bytes
y así sucesivamente.
¿Alguien puede darme una idea de cómo interpretar esto?, ahora leo cada línea
como un array de bytes, pero no se como coger los 20 bytes del tiempo o los 4
del número de entradas. ¿Existe en C# alguna clase o utilidad que permita
convertir en bits y leer sólo la parte que se necesite (por ejemplo
linea.get_bits(6)?

Gracias y un saludo

Derfel

"De todas las cosas que se pueden
hacer con un ordenador,la más inútil
es la más divertida"

Preguntas similare

Leer las respuestas

#1 Derfel
24/05/2004 - 17:40 | Informe spam
Derfel escribió en news::

Hola a todos/as
Tengo que hacer un programa que interprete un fichero binario, este
fichero está compuesto por líneas de 139 bytes donde cada línea tiene:
8 bytes: Indican el número de elementos
6 bytes: Indican el año
20 bytes: El tiempo en minutos
8 bytes: Valor de entrada
4 bytes: Número de entradas
1 byte: Validez
32 bytes:
32 bytes:
6: bytes
y así sucesivamente.



Ya lo he resuelto con la siguiente clase (sacada de una respuesta del grupo
de python):

public class bitter
{
private byte[] datos;
private int bit;
private int idx;

public bitter(byte[] data)
{
datos = data;
bit = 0;
idx = 0;
}

public int get_bits(int count)
{
if(count == 0) return 0;
if(datos == null) return 0;
if(datos.Length == 0) return 0;

int val = 0;

for(int i=0; i<count; i++)
{
if(idx == datos.Length)
return 0;

val <<= 1;
int shifted = datos[idx] >> (8 - bit - 1);
val |= (shifted & 1);
bit += 1;
if(bit == 8)
{
idx ++;
bit = 0;
}
}
return val;
}
}

la forma de usarla es:
bitter bt = new bitter(bytes);
int num = bt.get_bits(8);
int anyo = bt.get_bits(6)


Salu2
Derfel

"De todas las cosas que se pueden
hacer con un ordenador,la más inútil
es la más divertida"
Respuesta Responder a este mensaje
#2 Diego Gonzalez
24/05/2004 - 18:44 | Informe spam
Puedes abrir el archivo con un FileStream y utilizar un BinaryReader para
leer los bytes. Presta atención al formato utilizado por BinaryReader dado
que tal vez no sea el mismo que esperas.

Saludos,
Diego Gonzalez
Lagash Systems SA

"Derfel" wrote in message news:
Hola a todos/as
Tengo que hacer un programa que interprete un fichero binario, este


fichero
está compuesto por líneas de 139 bytes donde cada línea tiene:
8 bytes: Indican el número de elementos
6 bytes: Indican el año
20 bytes: El tiempo en minutos
8 bytes: Valor de entrada
4 bytes: Número de entradas
1 byte: Validez
32 bytes:
32 bytes:
6: bytes
y así sucesivamente.
¿Alguien puede darme una idea de cómo interpretar esto?, ahora leo cada


línea
como un array de bytes, pero no se como coger los 20 bytes del tiempo o


los 4
del número de entradas. ¿Existe en C# alguna clase o utilidad que permita
convertir en bits y leer sólo la parte que se necesite (por ejemplo
linea.get_bits(6)?

Gracias y un saludo

Derfel

"De todas las cosas que se pueden
hacer con un ordenador,la más inútil
es la más divertida"
Respuesta Responder a este mensaje
#3 Octavio Hernandez
27/05/2004 - 23:43 | Informe spam
Hola,

- Lee cada línea a un array de bytes.
- El método estático Array.Copy te permite extraer un sub-array de un array,
indicando la posición de inicio y cuántos elementos te interesan. Con eso
podrás fácilmente separar cada campo de la línea.

Slds,

Octavio

"Derfel" escribió en el mensaje
news:
Hola a todos/as
Tengo que hacer un programa que interprete un fichero binario, este


fichero
está compuesto por líneas de 139 bytes donde cada línea tiene:
8 bytes: Indican el número de elementos
6 bytes: Indican el año
20 bytes: El tiempo en minutos
8 bytes: Valor de entrada
4 bytes: Número de entradas
1 byte: Validez
32 bytes:
32 bytes:
6: bytes
y así sucesivamente.
¿Alguien puede darme una idea de cómo interpretar esto?, ahora leo cada


línea
como un array de bytes, pero no se como coger los 20 bytes del tiempo o


los 4
del número de entradas. ¿Existe en C# alguna clase o utilidad que permita
convertir en bits y leer sólo la parte que se necesite (por ejemplo
linea.get_bits(6)?

Gracias y un saludo

Derfel

"De todas las cosas que se pueden
hacer con un ordenador,la más inútil
es la más divertida"
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida