Principales respuestas
Ayuda con union de byte[] C#

Pregunta
-
Hola a todos como estan...
Tengo el siguiente metodo que me une 2 byte[]
byte[] Combine(byte[] a1, byte[] a2)
{
byte[] ret = new byte[a1.Length + a2.Length];
Array.Copy(a1, 0, ret, 0, a1.Length);
Array.Copy(a2, 0, ret, a1.Length, a2.Length);
return ret;
}
Ahora necesito hacer un metodo que me devuelva cada byte[] por separado...
De antemano mil gracias...
miércoles, 7 de julio de 2010 17:41
Respuestas
-
el tema es que el contenido ahora esta unido en un sola variable, como saber que contenido de cada item del array de byte pertenerce a uno como para separarloahora si lo que necesitas es es tomar una x cantidad de items y separar entocnes podrias usar la misma tecnica con el Array.Copy()
byte[] completo = Combine(....)
byte[] a1;
byte[] a2;
Array.Copy(completo, 0, a1, 0, completo.Length/2);
Array.Copy(completo, 0, a2, completo.Length/2, (completo.Length - (completo.Length/2)));este ejemplo solo funcionaria si la cantidd de items es par, asi al partir a la mitas devuelve numeros enteros, si es impart habria que calcular un poco mas asi se evita la fraccion
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator jueves, 8 de julio de 2010 16:34
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
miércoles, 7 de julio de 2010 18:04 -
Si lo que quieres es separar los bytes dada una posición, podrías hacer algocomo:void Split(byte[] source, int position, out byte[] a1, out byte[] a2){if (position > source.Length - 1)throw new ArgumentException("position no puede ser mayor al tamañodel array.");a1 = new byte[position];a2 = new byte[source.Length - position];Array.Copy(source, 0, a1, 0, position);Array.Copy(source, position, a2, 0, source.Length - position);}Y lo podrías usar algo así:byte[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };byte[] b1, b2;Split(b, 3, out b1, out b2);donde b1 tendría { 1, 2, 3 } y b2 tendría { 4, 5, 6, 7, 8, 9, 10 }. ¿Tesirve algo así, o os entendí mal?Saludos.
Fernando Gómez
fermasmas.wordpress.com- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator jueves, 8 de julio de 2010 16:34
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
miércoles, 7 de julio de 2010 18:07 -
lo que debes hacer es no guardar las imagenes tal cual en la base de datos..
lo correcto es que antes de insertar los array de bytes que representan las imagenes guardes otra informacion relacionada a al distribucion de esas imagenes, por ejemplo deberias guardar esta info
long: # del byte donde inicia de informacion de imagenes
int:# de imagenes
long: cantidad de bytes imagen 1
long: cantidad de bytes imagen 2
long: cantidad de bytes imagen 3
long: cantidad de bytes imagen N
byte[] bytes de las imagenes
asi que como veras debes tener mas trabajo antes de guardar en la base de datos para en el mismo campo guardar toda la información que necesitas para luego poder 'entender' la informacion de las imagenes almacenadas.
Juan Carlos Ruiz
Microsoft MVP - Visual C#
Visita mi blog:Ideas de Un Conejo - http://juank.black-byte.com
- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator jueves, 8 de julio de 2010 16:38
- Marcado como respuesta AdyIr jueves, 8 de julio de 2010 20:59
jueves, 8 de julio de 2010 16:38Moderador -
así es amigo...
entonces alli llega al rescate la clase Bitconverter
Juan Carlos Ruiz - Microsoft MVP Visual C#
Sígueme en Twitter: @JuanKRuiz
Visita mi blog: C#, XNA, Win32 - http://juank.black-byte.com
- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator lunes, 12 de julio de 2010 18:52
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
lunes, 12 de julio de 2010 18:52Moderador -
así es amigo...
entonces alli llega al rescate la clase Bitconverter
Juan Carlos Ruiz - Microsoft MVP Visual C#
Sígueme en Twitter: @JuanKRuiz
Visita mi blog: C#, XNA, Win32 - http://juank.black-byte.com
Hola amigo muchisimas gracias por tu ayuda, me ayudo a llegar a mi resultado... Tambien como sugirio Leandro divide los arreglos desde un punto dado....Esta es la manera que logre hacerlo y aunque esta un poco larga y estoy seguro que alguien la puede hacer mas optima y mejor, igual la compartiré con ustedes…
Tengo una lista generica que contiene el elemento “imagenHuella” de una clase… Esta puede contener hasta un máximo de 10 huellas…
Ejecuto la función..
byte[] imagenesHuellas = ClassFunciones.ArmarImagenes(ClassRegistrosBiometricos.listaImagenesHuellas);
public static byte[] ArmarImagenes(List<ClassRegistrosBiometricos.ClaseImagenesHuellas> listaImagenes)
{
// Defino número de imagenes y variable que contendra todas las imagenes
byte numeroImagenes = (byte)listaImagenes.Count;
byte[] imagenesHuellas = listaImagenes[0].imagenHuella;
// El tamaño de cada una de las imagenes
int[] tamañosImagenesInt = new int[10];
tamañosImagenesInt[0] = listaImagenes[0].imagenHuella.Length;
// Obtengo cada una de las imagenes y sus tamaños
for (int i = 1; i < listaImagenes.Count; i++)
{
tamañosImagenesInt[i] = listaImagenes[i].imagenHuella.Length;
imagenesHuellas = CombinarByte(imagenesHuellas, listaImagenes[i].imagenHuella);
}
// Determino el punto donde comenzara la coleccion de imagenes en el arreglo
byte puntoIncioImagenes = (byte)((listaImagenes.Count * 4) + 2);
// Convierto en byte[] todos los pesos de cada unas de las imagenes las cuales se encontraban como tipo int
byte[] tamañoImagenesByte = BitConverter.GetBytes(tamañosImagenesInt[0]);
for (int i = 1; i < numeroImagenes; i++)
{
tamañoImagenesByte = CombinarByte(tamañoImagenesByte, BitConverter.GetBytes(tamañosImagenesInt[i]));
}
// Defino un arreglo y le introduzco el numero de imagenes que contendra y el punto de inicio de estas
byte[] ret = new byte[2];
ret[0] = numeroImagenes;
ret[1] = puntoIncioImagenes;
// Combino los arreglos que contiene la informacion con los respectivos peso de cada imagen, este arreglo servirá para extraer cada una las imagenes en el proceso inverto a este
ret = CombinarByte(ret, tamañoImagenesByte);
// Combino los arreglos que contiene la informacion para extraer cada una de las imagenes con las imagenes
ret = CombinarByte(ret, imagenesHuellas);
return ret;
}
public static byte[] Split(byte[] arreglo, byte numeroImagene, int[] tamañoImagenes)
{
// Defino el tamaño del arreglo que contiene el tamaño de la imagen
int lenght = tamañoImagenes[numeroImagene - 1];
// Creo byte[] del tamaño de los arreglos de la imagen
byte[] ret = new byte[lenght];
// Creo que una variable que me indica el elemento del byte[] donde empieza la imagen
int inicioImagen = arreglo[1];
// Dependiendo de cual imagen del arreglo este buscando incremento el valor de la variable empieza
for (int i = 0; i < numeroImagene; i++)
{
if (i > 0)
inicioImagen += tamañoImagenes[i - 1];
}
// Creo que el byte[] que contiene el elemento de la imagen la cual fue indicada en numeroImagen
Array.Copy(arreglo, inicioImagen, ret, 0, lenght);
return ret;
}
public static byte[] CombinarByte(byte[] a1, byte[] a2)
{
// Creo un byte[] sumando los dos arreglos a unior
byte[] arreglo = new byte[a1.Length + a2.Length];
// Agrego cada byte[] a la variable arreglo
Array.Copy(a1, 0, arreglo, 0, a1.Length);
Array.Copy(a2, 0, arreglo, a1.Length, a2.Length);
return arreglo;
}
Y este es el proceso para volver a obtener todas mis imágenes…
// Inserto en un byte[] los datos obtenidos de la base de datos del campo Imagenes
byte[] imagenes = claseEntidad.imagenes;
// Mediante el primero elemento del arreglo obtenido "Imagenes" obtengo el número de imagenes que posee el arreglo
byte numeroHuellas = claseEntidad.imagenes[0];
// Creo un int[] con una dimension igual al número de imagenes que posee el arreglo, aqui se almaceran el tamaño de cada una de las imagenes
int[] tamañoImagenes = new int[imagenes[0]];
// El arreglo imagenes en su 1er elemento posee el número de imagenes que posee, el 2do muestra el punto de inicio de las imagenes y desde el 3ro hasta el punto de inicio de las imagenes esta su peso
// Los pesos de las imagenes eran de tipo int y los mismos tuvieron que se convertidos a byte[] para ser insertados en el arreglo de las imagenes, aqui se obtienen cada uno de estos pesos y se insertan en el arreglo tamañoImagenes
byte tamañosInsertados = 0;
for (int i = 2; i <= numeroHuellas * 4; i += 4)
{
byte[] procesoTamaño = new byte[4];
byte bytesProcesados = 0;
for (int j = i; j < i + 4; j++)
{
procesoTamaño[bytesProcesados] = imagenes[j];
bytesProcesados += 1;
}
tamañoImagenes[tamañosInsertados] = BitConverter.ToInt32(procesoTamaño, 0);
tamañosInsertados += 1;
}
// Obtengo cada imagen y ejecuto la funcion Split
byte imagenesProcesadas = 1;
for (int i = 0; i < imagenes[0]; i++)
{
byte[] imagenHuella = ClassFunciones.Split(imagenes, imagenesProcesadas, tamañoImagenes);
imagenesProcesadas += 1;
}
public static byte[] Split(byte[] arreglo, byte numeroImagene, int[] tamañoImagenes)
{
// Defino el tamaño del arreglo que contiene el tamaño de la imagen
int lenght = tamañoImagenes[numeroImagene - 1];
// Creo byte[] del tamaño de los arreglos de la imagen
byte[] ret = new byte[lenght];
// Creo que una variable que me indica el elemento del byte[] donde empieza la imagen
int inicioImagen = arreglo[1];
// Dependiendo de cual imagen del arreglo este buscando incremento el valor de la variable empieza
for (int i = 0; i < numeroImagene; i++)
{
if (i > 0)
inicioImagen += tamañoImagenes[i - 1];
}
// Creo que el byte[] que contiene el elemento de la imagen la cual fue indicada en numeroImagen
Array.Copy(arreglo, inicioImagen, ret, 0, lenght);
return ret;
}
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
martes, 13 de julio de 2010 14:22
Todas las respuestas
-
el tema es que el contenido ahora esta unido en un sola variable, como saber que contenido de cada item del array de byte pertenerce a uno como para separarloahora si lo que necesitas es es tomar una x cantidad de items y separar entocnes podrias usar la misma tecnica con el Array.Copy()
byte[] completo = Combine(....)
byte[] a1;
byte[] a2;
Array.Copy(completo, 0, a1, 0, completo.Length/2);
Array.Copy(completo, 0, a2, completo.Length/2, (completo.Length - (completo.Length/2)));este ejemplo solo funcionaria si la cantidd de items es par, asi al partir a la mitas devuelve numeros enteros, si es impart habria que calcular un poco mas asi se evita la fraccion
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator jueves, 8 de julio de 2010 16:34
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
miércoles, 7 de julio de 2010 18:04 -
Si lo que quieres es separar los bytes dada una posición, podrías hacer algocomo:void Split(byte[] source, int position, out byte[] a1, out byte[] a2){if (position > source.Length - 1)throw new ArgumentException("position no puede ser mayor al tamañodel array.");a1 = new byte[position];a2 = new byte[source.Length - position];Array.Copy(source, 0, a1, 0, position);Array.Copy(source, position, a2, 0, source.Length - position);}Y lo podrías usar algo así:byte[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };byte[] b1, b2;Split(b, 3, out b1, out b2);donde b1 tendría { 1, 2, 3 } y b2 tendría { 4, 5, 6, 7, 8, 9, 10 }. ¿Tesirve algo así, o os entendí mal?Saludos.
Fernando Gómez
fermasmas.wordpress.com- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator jueves, 8 de julio de 2010 16:34
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
miércoles, 7 de julio de 2010 18:07 -
Bueno les cuento que necesito como tal... Quiero guardar en una base de datos N imagenes, pero quiero que estas se guarden en un solo campo de una tabla... Y luego poder obtener mis imagenes "cuantas sean" de vuelta... Estaba pensando en guardar objetos serializados y luego deserializarlo, pero no se si esto optimo y me gustaria saber si hay otras opciones...
miércoles, 7 de julio de 2010 20:29 -
el tema es que el contenido ahora esta unido en un sola variable, como saber que contenido de cada item del array de byte pertenerce a uno como para separarloahora si lo que necesitas es es tomar una x cantidad de items y separar entocnes podrias usar la misma tecnica con el Array.Copy()
byte[] completo = Combine(....)
byte[] a1;
byte[] a2;
Array.Copy(completo, 0, a1, 0, completo.Length/2);
Array.Copy(completo, 0, a2, completo.Length/2, (completo.Length - (completo.Length/2)));este ejemplo solo funcionaria si la cantidd de items es par, asi al partir a la mitas devuelve numeros enteros, si es impart habria que calcular un poco mas asi se evita la fraccion
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina
Hola que tal como estas gracias por la respuesta... Bueno puse información adicional para que se entienda que es lo que quiero...miércoles, 7 de julio de 2010 20:30 -
Si lo que quieres es separar los bytes dada una posición, podrías hacer algocomo:void Split(byte[] source, int position, out byte[] a1, out byte[] a2){if (position > source.Length - 1)throw new ArgumentException("position no puede ser mayor al tamañodel array.");a1 = new byte[position];a2 = new byte[source.Length - position];Array.Copy(source, 0, a1, 0, position);Array.Copy(source, position, a2, 0, source.Length - position);}Y lo podrías usar algo así:byte[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };byte[] b1, b2;Split(b, 3, out b1, out b2);donde b1 tendría { 1, 2, 3 } y b2 tendría { 4, 5, 6, 7, 8, 9, 10 }. ¿Tesirve algo así, o os entendí mal?Saludos.
Fernando Gómez
fermasmas.wordpress.com
Hola que tal... Gracias por tu respuesta como le comente a Leandro puse información adicional para que se entienda mejor...miércoles, 7 de julio de 2010 20:30 -
Hola. En mi opinión, sería mejor que normalizaras un poquito más tu base dedatos. Si tienes tu tabla Producto con su llave Id (por poner un ejemplo),en lugar de añadir un campo que se llame "Imagen", mejor créate una tablaImagenProducto donde tendrías como llave foránea a Id de la tabla Producto.Así, puedes tener una relación uno a varios entre producto e imágenes.Ahora, si aún así quieres seguir con tu estrategia, puedes guardar cadaimagen (byte[]) en una colección, digamos, List<T>, y como decías laserializas y deserializas. Por ejemplo:using System;using System.Collection.Generics;using System.IO;using System.Runtime.Serialization.Formatters.Binary;....List<byte[]> list = new List<byte[]>();list.Add(new byte[] { 1, 2, 3, 4, 5 });list.Add(new byte[] { 6, 7, 8, 9, 10 });list.Add(new byte[] { 11, 12, 13 });list.Add(new byte[] { 14, 15, 16, 17, 18, 19, 20 });BinaryFormatter f = new BinaryFormatter();MemoryStream stream = new MemoryStream();f.Serialize(stream, list); // serializadostream.Seek(0, SeekOrigin.Begin);list = f.Deserialize(stream) as List<byte[]>; // deserializadoforeach (byte[] bs in list){foreach (byte b in bs)Console.Write("{0} ", b);Console.WriteLine();}El stream es lo que guardarías en la base de datos y cuando leas, loobtienes y lo pasas a un memory stream y lixto. Yo creo que con esotendrías.Saludos.
Fernando Gómez
fermasmas.wordpress.commiércoles, 7 de julio de 2010 21:23 -
Hola. En mi opinión, sería mejor que normalizaras un poquito más tu base dedatos. Si tienes tu tabla Producto con su llave Id (por poner un ejemplo),en lugar de añadir un campo que se llame "Imagen", mejor créate una tablaImagenProducto donde tendrías como llave foránea a Id de la tabla Producto.Así, puedes tener una relación uno a varios entre producto e imágenes.Ahora, si aún así quieres seguir con tu estrategia, puedes guardar cadaimagen (byte[]) en una colección, digamos, List<T>, y como decías laserializas y deserializas. Por ejemplo:using System;using System.Collection.Generics;using System.IO;using System.Runtime.Serialization.Formatters.Binary;....List<byte[]> list = new List<byte[]>();list.Add(new byte[] { 1, 2, 3, 4, 5 });list.Add(new byte[] { 6, 7, 8, 9, 10 });list.Add(new byte[] { 11, 12, 13 });list.Add(new byte[] { 14, 15, 16, 17, 18, 19, 20 });BinaryFormatter f = new BinaryFormatter();MemoryStream stream = new MemoryStream();f.Serialize(stream, list); // serializadostream.Seek(0, SeekOrigin.Begin);list = f.Deserialize(stream) as List<byte[]>; // deserializadoforeach (byte[] bs in list){foreach (byte b in bs)Console.Write("{0} ", b);Console.WriteLine();}El stream es lo que guardarías en la base de datos y cuando leas, loobtienes y lo pasas a un memory stream y lixto. Yo creo que con esotendrías.Saludos.
Fernando Gómez
fermasmas.wordpress.com
Hola de nuevo amigo, no puedo hacer lo de la base de datos, esta ya tiene su logica de negocio creada tengo que trabajar en base a esta, estoy tratando de ver si se puede aplicar una marca a las imagenes que agrege o algo asi y luego tratarla... Si no no me queda mas que la serialización... Dejame seguir leyendo y te cuento, muchas gracias...miércoles, 7 de julio de 2010 21:45 -
lo que debes hacer es no guardar las imagenes tal cual en la base de datos..
lo correcto es que antes de insertar los array de bytes que representan las imagenes guardes otra informacion relacionada a al distribucion de esas imagenes, por ejemplo deberias guardar esta info
long: # del byte donde inicia de informacion de imagenes
int:# de imagenes
long: cantidad de bytes imagen 1
long: cantidad de bytes imagen 2
long: cantidad de bytes imagen 3
long: cantidad de bytes imagen N
byte[] bytes de las imagenes
asi que como veras debes tener mas trabajo antes de guardar en la base de datos para en el mismo campo guardar toda la información que necesitas para luego poder 'entender' la informacion de las imagenes almacenadas.
Juan Carlos Ruiz
Microsoft MVP - Visual C#
Visita mi blog:Ideas de Un Conejo - http://juank.black-byte.com
- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator jueves, 8 de julio de 2010 16:38
- Marcado como respuesta AdyIr jueves, 8 de julio de 2010 20:59
jueves, 8 de julio de 2010 16:38Moderador -
lo que debes hacer es no guardar las imagenes tal cual en la base de datos..
lo correcto es que antes de insertar los array de bytes que representan las imagenes guardes otra informacion relacionada a al distribucion de esas imagenes, por ejemplo deberias guardar esta info
long: # del byte donde inicia de informacion de imagenes
int:# de imagenes
long: cantidad de bytes imagen 1
long: cantidad de bytes imagen 2
long: cantidad de bytes imagen 3
long: cantidad de bytes imagen N
byte[] bytes de las imagenes
asi que como veras debes tener mas trabajo antes de guardar en la base de datos para en el mismo campo guardar toda la información que necesitas para luego poder 'entender' la informacion de las imagenes almacenadas.
Juan Carlos Ruiz
Microsoft MVP - Visual C#
Visita mi blog:Ideas de Un Conejo - http://juank.black-byte.com
Perfecto amigo, muchas gracias buena idea...jueves, 8 de julio de 2010 20:59 -
lo que debes hacer es no guardar las imagenes tal cual en la base de datos..
lo correcto es que antes de insertar los array de bytes que representan las imagenes guardes otra informacion relacionada a al distribucion de esas imagenes, por ejemplo deberias guardar esta info
long: # del byte donde inicia de informacion de imagenes
int:# de imagenes
long: cantidad de bytes imagen 1
long: cantidad de bytes imagen 2
long: cantidad de bytes imagen 3
long: cantidad de bytes imagen N
byte[] bytes de las imagenes
asi que como veras debes tener mas trabajo antes de guardar en la base de datos para en el mismo campo guardar toda la información que necesitas para luego poder 'entender' la informacion de las imagenes almacenadas.
Juan Carlos Ruiz
Microsoft MVP - Visual C#
Visita mi blog:Ideas de Un Conejo - http://juank.black-byte.com
Hola Juan Carlos... Una pregunta de algo que pase por alto cuando lei la respuesta en primera instancia, me estas diciendo que por ejemplo, si quiero guardar 5 imagenes, El primer elemento del array tenga el, El segundo el N° del elemento de donde empiezan las imagenes, N° de imagenes, leuego el tamaño de cada imagen y al final toda la coleccion... Pero como voy hacer para insertar alli los tamaños de las imagenes si esos son del tipo int o long.... Mientras que mi arreglos es de byte....lunes, 12 de julio de 2010 18:38 -
así es amigo...
entonces alli llega al rescate la clase Bitconverter
Juan Carlos Ruiz - Microsoft MVP Visual C#
Sígueme en Twitter: @JuanKRuiz
Visita mi blog: C#, XNA, Win32 - http://juank.black-byte.com
- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator lunes, 12 de julio de 2010 18:52
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
lunes, 12 de julio de 2010 18:52Moderador -
así es amigo...
entonces alli llega al rescate la clase Bitconverter
Juan Carlos Ruiz - Microsoft MVP Visual C#
Sígueme en Twitter: @JuanKRuiz
Visita mi blog: C#, XNA, Win32 - http://juank.black-byte.com
Hola amigo muchisimas gracias por tu ayuda, me ayudo a llegar a mi resultado... Tambien como sugirio Leandro divide los arreglos desde un punto dado....Esta es la manera que logre hacerlo y aunque esta un poco larga y estoy seguro que alguien la puede hacer mas optima y mejor, igual la compartiré con ustedes…
Tengo una lista generica que contiene el elemento “imagenHuella” de una clase… Esta puede contener hasta un máximo de 10 huellas…
Ejecuto la función..
byte[] imagenesHuellas = ClassFunciones.ArmarImagenes(ClassRegistrosBiometricos.listaImagenesHuellas);
public static byte[] ArmarImagenes(List<ClassRegistrosBiometricos.ClaseImagenesHuellas> listaImagenes)
{
// Defino número de imagenes y variable que contendra todas las imagenes
byte numeroImagenes = (byte)listaImagenes.Count;
byte[] imagenesHuellas = listaImagenes[0].imagenHuella;
// El tamaño de cada una de las imagenes
int[] tamañosImagenesInt = new int[10];
tamañosImagenesInt[0] = listaImagenes[0].imagenHuella.Length;
// Obtengo cada una de las imagenes y sus tamaños
for (int i = 1; i < listaImagenes.Count; i++)
{
tamañosImagenesInt[i] = listaImagenes[i].imagenHuella.Length;
imagenesHuellas = CombinarByte(imagenesHuellas, listaImagenes[i].imagenHuella);
}
// Determino el punto donde comenzara la coleccion de imagenes en el arreglo
byte puntoIncioImagenes = (byte)((listaImagenes.Count * 4) + 2);
// Convierto en byte[] todos los pesos de cada unas de las imagenes las cuales se encontraban como tipo int
byte[] tamañoImagenesByte = BitConverter.GetBytes(tamañosImagenesInt[0]);
for (int i = 1; i < numeroImagenes; i++)
{
tamañoImagenesByte = CombinarByte(tamañoImagenesByte, BitConverter.GetBytes(tamañosImagenesInt[i]));
}
// Defino un arreglo y le introduzco el numero de imagenes que contendra y el punto de inicio de estas
byte[] ret = new byte[2];
ret[0] = numeroImagenes;
ret[1] = puntoIncioImagenes;
// Combino los arreglos que contiene la informacion con los respectivos peso de cada imagen, este arreglo servirá para extraer cada una las imagenes en el proceso inverto a este
ret = CombinarByte(ret, tamañoImagenesByte);
// Combino los arreglos que contiene la informacion para extraer cada una de las imagenes con las imagenes
ret = CombinarByte(ret, imagenesHuellas);
return ret;
}
public static byte[] Split(byte[] arreglo, byte numeroImagene, int[] tamañoImagenes)
{
// Defino el tamaño del arreglo que contiene el tamaño de la imagen
int lenght = tamañoImagenes[numeroImagene - 1];
// Creo byte[] del tamaño de los arreglos de la imagen
byte[] ret = new byte[lenght];
// Creo que una variable que me indica el elemento del byte[] donde empieza la imagen
int inicioImagen = arreglo[1];
// Dependiendo de cual imagen del arreglo este buscando incremento el valor de la variable empieza
for (int i = 0; i < numeroImagene; i++)
{
if (i > 0)
inicioImagen += tamañoImagenes[i - 1];
}
// Creo que el byte[] que contiene el elemento de la imagen la cual fue indicada en numeroImagen
Array.Copy(arreglo, inicioImagen, ret, 0, lenght);
return ret;
}
public static byte[] CombinarByte(byte[] a1, byte[] a2)
{
// Creo un byte[] sumando los dos arreglos a unior
byte[] arreglo = new byte[a1.Length + a2.Length];
// Agrego cada byte[] a la variable arreglo
Array.Copy(a1, 0, arreglo, 0, a1.Length);
Array.Copy(a2, 0, arreglo, a1.Length, a2.Length);
return arreglo;
}
Y este es el proceso para volver a obtener todas mis imágenes…
// Inserto en un byte[] los datos obtenidos de la base de datos del campo Imagenes
byte[] imagenes = claseEntidad.imagenes;
// Mediante el primero elemento del arreglo obtenido "Imagenes" obtengo el número de imagenes que posee el arreglo
byte numeroHuellas = claseEntidad.imagenes[0];
// Creo un int[] con una dimension igual al número de imagenes que posee el arreglo, aqui se almaceran el tamaño de cada una de las imagenes
int[] tamañoImagenes = new int[imagenes[0]];
// El arreglo imagenes en su 1er elemento posee el número de imagenes que posee, el 2do muestra el punto de inicio de las imagenes y desde el 3ro hasta el punto de inicio de las imagenes esta su peso
// Los pesos de las imagenes eran de tipo int y los mismos tuvieron que se convertidos a byte[] para ser insertados en el arreglo de las imagenes, aqui se obtienen cada uno de estos pesos y se insertan en el arreglo tamañoImagenes
byte tamañosInsertados = 0;
for (int i = 2; i <= numeroHuellas * 4; i += 4)
{
byte[] procesoTamaño = new byte[4];
byte bytesProcesados = 0;
for (int j = i; j < i + 4; j++)
{
procesoTamaño[bytesProcesados] = imagenes[j];
bytesProcesados += 1;
}
tamañoImagenes[tamañosInsertados] = BitConverter.ToInt32(procesoTamaño, 0);
tamañosInsertados += 1;
}
// Obtengo cada imagen y ejecuto la funcion Split
byte imagenesProcesadas = 1;
for (int i = 0; i < imagenes[0]; i++)
{
byte[] imagenHuella = ClassFunciones.Split(imagenes, imagenesProcesadas, tamañoImagenes);
imagenesProcesadas += 1;
}
public static byte[] Split(byte[] arreglo, byte numeroImagene, int[] tamañoImagenes)
{
// Defino el tamaño del arreglo que contiene el tamaño de la imagen
int lenght = tamañoImagenes[numeroImagene - 1];
// Creo byte[] del tamaño de los arreglos de la imagen
byte[] ret = new byte[lenght];
// Creo que una variable que me indica el elemento del byte[] donde empieza la imagen
int inicioImagen = arreglo[1];
// Dependiendo de cual imagen del arreglo este buscando incremento el valor de la variable empieza
for (int i = 0; i < numeroImagene; i++)
{
if (i > 0)
inicioImagen += tamañoImagenes[i - 1];
}
// Creo que el byte[] que contiene el elemento de la imagen la cual fue indicada en numeroImagen
Array.Copy(arreglo, inicioImagen, ret, 0, lenght);
return ret;
}
- Marcado como respuesta AdyIr martes, 13 de julio de 2010 14:33
martes, 13 de julio de 2010 14:22