Índice
0. Introducción1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura
0. Introducción
En la receta anterior -Receta No. 2-2 en C#: Codificar una Cadena deCaracteres usando un Sistema de Codificación Alternativo- usamos un recurso del
Framework .NET para realizar la conversión de un flujo de cadena de bytes a un
flujo de caracteres que representa cada byte en el arreglo: BitConverter.ToString(byte[]). Vamos a aprovechar ahora para preparar una receta
utilizando este artefacto entre otros, precisamente, vamos a convertir tipos numéricos a
arreglo de bytes (o viceversa).
1. Problema
Necesitamos de un artefacto del Framework .NET para convertir tipos de datos integrales a arreglo de bytes. (El proceso contrario, es decir, de arreglo de bytes a tipos integrales también debe ser posible).
2. Solución
La clase BitConverter [2] provee la maquinaria (conjunto de métodos estáticos) para realizar este tipo de conversión: tipos por valor a arreglo de bytes. También se descubrió que posee métodos para realizar el proceso reversible: convertir un arreglo de bytes a un tipo por valor.
3. Discusión de la Solución
Ya dijimos que la clase BitConverter provee métodos para lograr este tipo de conversión. En especial hay un método GetBytes [4] que posee varias versiones sobrecargadas.
Figura 1. Versiones sobrecargada método GetBytes de BitConverter [4]. |
Observemos en la Figura 1 que bytes tiene soporte para todos los tipos de datos por valor. A saber:
- Boolean
- Char
- Double
- Int16
- Int32
- Int64
- Single
- UInt16
- IInt32
- UInt64
Tenemos que saber que para la conversión de un valor de punto flotante debe realizarse utilizando otro recurso (como veremos en la parte práctica):
System.IO.MemoryStream [5]
Para lograrlo, pasamos como argumento un objeto de la clase anterior sobre un objeto del tipo BinaryWriter [6] (namespace: System.IO).
4. Práctica: Código Fuente C#
En este ejemplo vamos a demostrar el uso de la clase BitConverter, y de otros dos recursos MemoryStream (junto con BinaryWriter [6], y BinaryReader [7]) y BitConverter para lograr la conversión de un tipo numérico de punto flotante a un arreglo de bytes. La operación contraria, igualmente.
Archivo ConvertidorNumericoArregloBytes.cs:
[Nota: El código se haya auto-explicado con los comentarios XML y los en línea.]
Compilación:
> Prueba de ejecución.
Resultados:
Compilación:
- csc /target:exe ConvertidorNumeroArregloBytes.cs
> Prueba de ejecución.
Resultados:
01 (arreglo bytes) = True (booleano) 21-05-00-00 (arreglo bytes) = 1313 (entero) 83-24-6A-E7-B9-1D-01-00-00-00-00-00-00-00-0E-00 (arreglo bytes) = 3.14159265358979 (decimal)
Notas acerca de la salida:
Al realizar una invocación del método BitConverter.ToString(byte[]) se generará una cadena que representa los bytes que contiene el arreglo. Cada byte es representado en el sistema numérico hexadecimal. Cada byte se separa por un guión; como en:
21-05-00-00 (arreglo bytes) = 1313 (entero)
Conclusiones
En esta receta hemos aprendido a convertir tipos por valor a arreglos de bytes. El proceso contrario también lo practicamos en el ejemplo de la sección. Además vimos que el uso conjunto de las clases MemoryStream, BinaryWriter, BinaryReader (todas pertenecen al namespace: System.IO) permite realizar la conversión de valores decimales (e.g., 3.14159265358979M) a arreglos de bytes, y viceversa.
Glosario
- Arreglo
- Bytes
- Convertidor
- XML
Enlaces & Literatura
[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.[2]: BitConverter Class (System) - http://msdn.microsoft.com/en-us/library/system.bitconverter%28v=vs.110%29.aspx
[3]: Receta No. 2-2 en C#: Codificar una Cadena de Caracteres usando Sistema de Codificación Alternativo | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/04/receta-no-2-2-en-c-codificar-una-cadena.html
[4]: BitConverter.GetBytes Method (System) - http://msdn.microsoft.com/en-us/library/system.bitconverter.getbytes(v=vs.110).aspx
[5]: MemoryStream Class (System.IO) - http://msdn.microsoft.com/en-us/library/system.io.memorystream(v=vs.110).aspx
[6]: BinaryWriter Class (System.IO) - http://msdn.microsoft.com/en-us/library/system.io.binarywriter(v=vs.110).aspx
[7]: BinaryReader Class (System.IO) - http://msdn.microsoft.com/en-us/library/system.io.binaryreader%28v=vs.110%29.aspx
M