Conversion de Dato

24/11/2006 - 08:13 por Luis Eduardo Alvarado Meza | Informe spam
Antes que todo como estan gente del foro tengo ya más de 3 semanas de no
visitarlo por cuestiones laborales, sin embargo me lastima ver que el
problema de los post basura se quedara para siempre según veo, y a pesar de
que los post han disminuido no asi las participaciones de Jesus, Maxi,
Alberto ... entre otros no menos importantes.

Hoy necesito de su ayuda, me encuentro leyendo un archivo binario codificado
en ANS.1, pero a pesar de que es binario se lee byte por byte, estoy usando
un BinaryReader.

A traves del Convet.ToInt32 tengo la posibilidad de convertir a entero
desde una base 2, es decir binario. Anteriormente tenia una función propia
pero el Convert resulto ser más eficiente. Sin embargo, tengo una funcion
propia que convierte de Entero (o Byte) a una cadena de bits, pero desearia
saber si conocen alguna función propia del .net que hiciera este proceso
inverso al primero.

De no existir, me gustaria saber que algoritmo es más rapido o eficiente
para hacer esta trasformacion, actualmente yo tengo una division sucesiva
entre 2 hasta llegar a 0 usando Mod para el residuo. Veran el archivo a
leer tiene 6 Mb promedio y el ASN.1 no es tan fácil, y cualquier mejora que
me ahorre segundos de proceso es bienvenida asi como cualquier comentario
para agilizar la lectura o trabajar con bits.

Agredeciendoles su ayuda me despido bye

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
24/11/2006 - 09:17 | Informe spam
"Luis Eduardo Alvarado Meza" wrote in
message news:
A traves del Convet.ToInt32 tengo la posibilidad de convertir a entero
desde una base 2, es decir binario. Anteriormente tenia una función propia
pero el Convert resulto ser más eficiente. Sin embargo, tengo una funcion
propia que convierte de Entero (o Byte) a una cadena de bits, pero
desearia saber si conocen alguna función propia del .net que hiciera este
proceso inverso al primero.



No está claro a qué lo quieres convertir. ¿Qué entiendes por "cadena de
bits"? ¿Un String estilo "1001011101"? ¿O un array de bytes, es decir, pasar
de Integer a Byte(4)? ¿O un array de 32 Boolean? ¿O un objeto de tipo
BitArray?
Lo pregunto porque el entero YA está codificado en memoria en forma
binaria, con lo que el problema no es "convertir" nada, sino solo "mover"
los bits a otro tipo de contenedor. La solución óptima dependerá del tipo de
contenedor al que los quieras mover.
Si ya tienes una función hecha, puedes "postearla" aqui, para que veamos
si se nos ocurre alguna forma de optimizarla.
Respuesta Responder a este mensaje
#2 Luis Eduardo Alvarado Meza
24/11/2006 - 10:00 | Informe spam
Mover de Int32 as una cadena binaria, y como es eso de que ya esta en
binario? yo utilizo la función ReadByte de la clase binaryreader.

Y muchas gracias por contestar Alberto.
"Alberto Poblacion" wrote
in message news:
"Luis Eduardo Alvarado Meza" wrote
in message news:
A traves del Convet.ToInt32 tengo la posibilidad de convertir a entero
desde una base 2, es decir binario. Anteriormente tenia una función
propia pero el Convert resulto ser más eficiente. Sin embargo, tengo una
funcion propia que convierte de Entero (o Byte) a una cadena de bits,
pero desearia saber si conocen alguna función propia del .net que hiciera
este proceso inverso al primero.



No está claro a qué lo quieres convertir. ¿Qué entiendes por "cadena de
bits"? ¿Un String estilo "1001011101"? ¿O un array de bytes, es decir,
pasar de Integer a Byte(4)? ¿O un array de 32 Boolean? ¿O un objeto de
tipo BitArray?
Lo pregunto porque el entero YA está codificado en memoria en forma
binaria, con lo que el problema no es "convertir" nada, sino solo "mover"
los bits a otro tipo de contenedor. La solución óptima dependerá del tipo
de contenedor al que los quieras mover.
Si ya tienes una función hecha, puedes "postearla" aqui, para que veamos
si se nos ocurre alguna forma de optimizarla.



Respuesta Responder a este mensaje
#3 Alberto Poblacion
24/11/2006 - 10:21 | Informe spam
"Luis Eduardo Alvarado Meza" wrote in
message news:
Mover de Int32 as una cadena binaria,



Insisto, ¿qué es una "cadena binaria"? No existe en .Net una clase que se
llame "cadena binaria". ¿Por qué no indicas el objeto concreto en que
quieres meter el Int32?

y como es eso de que ya esta en binario?



El Int32 en memoria se guarda como 32 bits metidos en 4 octectos. Siempre
son bits en la memoria del ordenador.

yo utilizo la función ReadByte de la clase binaryreader.



Bueno, el ReadByte obtiene un Byte (8 bits) desde un Stream. ¿Qué tiene
que ver con "convertir un Int32 en (algo que no sabemos)"?

Danos más detalles de qué es lo que quieres convertir en qué. Pero no lo
digas en "lenguaje humano", que es muy ambiguo, sino en Visual Basic. Por
ejemplo algo asi como "Quiero una función que sea Function Convertir(dato as
Integer) As Byte(), donde el array Byte() tiene 4 elementos".
Respuesta Responder a este mensaje
#4 Luis Eduardo Alvarado Meza
24/11/2006 - 14:35 | Informe spam
Tienes razon me he portado como desgraciado novato, pero creo que es el
desvelo
Reeplanteo la situacion:
-Estoy decodificando un archivo en ASN.1, cuyo formato no es ASCII sino
binario.
-Para decodificar este tipo de Archivo se lee en Octectos, de 8 bits a la
vez, por ello utilizo ReadByte porque lee 8 bits del stream
-La representacion entera de ese Byte no me sirve y no me dice nada,
necesito la representacion binaria del byte que lei, es decir, que si el
Byte era 167, necesito una cadena como esta: "10100111", y si el Byte fuera
1 seria asi: "00000001". En ASN.1 son ciertos bits del octecto los que te
sirven de control y cierta secuencia de bits con cierta distribucion me van
definiendo una estructura de arbol, y semejandose solo un poco a un XML

Manualmente tengo una funcion que lo que hace es dividir el 167 entre 2
multiples veces hasta llegar a cero, y los residuos me dicen la
representacion binaria de ese Byte, pero dado que esta operacion se realiza
millones de veces porque los archivos a decodificar son de muchos megabytes,
me interesa saber si el framework cuenta con una funcion optimizada que haga
esto:

Dim Bits as string = DameCadenaDeBits(167)
donde la funcion retorna el "00000001"

La funcion seria asi: function DameCadenDeBits(valor as Integer ) as
String
y le paso INteger y no byte, porque en algunos especiales necesito la cadena
de bits de un entero superior a los 255.

La funcion que temporalmente hace esta conversion manual no la tengo a mano,
sera cuando llegue a mi trabajo que te la pueda dar para ver si se le puede
mejorar el rendimiento en el caso que el framework no cuente con una funcion
asi.

Espero haberme explicado bien. y como te digo disculpame
Respuesta Responder a este mensaje
#5 Alberto Poblacion
24/11/2006 - 15:27 | Informe spam
"Luis Eduardo Alvarado Meza" wrote in
message news:
Dim Bits as string = DameCadenaDeBits(167)
donde la funcion retorna el "00000001"



Vale, por fin, en resumen, de las varias opciones que te ofrecí en la
respuesta al mensaje inicial, la buena era la que devolvía una cadena con
los bits en forma de caracteres "0" y "1".

En teoría, la forma en que lo haces (usando el módulo y la división por
dos) es correcta. Si las optimizaciones del compilador están bien hechas, la
división por 2 y el módulo 2 se deberían convertir una vez compiladas en
desplazamientos de bits, que son muy rápidos. Si no es asi (cosa que se
puede verificar con el ILDASM), una alternativa sería escribir un pequeño
módulo en C#, que sí que permite hacerlo con el operador >>, y linkarlo con
el programa en VB.

Pero no creo que esté ahi el problema. Habría que ver cómo tienes escrita
la rutina, pero algunas cosillas que se me ocurre que posiblemente no hayas
hecho y que se pueden optimizar son estas:
- La división por 2, asegúrate de que la haces "entera" y no "flotante",
es decir, con "\" y no con "/".
- En lugar del Módulo 2, usa "AND 1" para comprobar el bit menos
significativo.
- Si estás concatenando los bits en un string, usa un StringBuilder para
minimizar las construcciones y destrucciones internas del objeto string.

En resumidas cuentas, la función quedaría parecida a la siguiente
(escrita de memoria, no la he probado):

Function DameCadenDeBits(valor as Integer) as String
Dim sb as New StringBuilder(32)
While valor<>0
If valor And 1 Then
sb.Insert(0, "1"c)
Else
sb.Insert(0, "0"c)
End If
valor \= 2
End While
Return sb.ToString()
End Function
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida