locked
Ayuda con union de byte[] C# RRS feed

  • 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 separarlo

    ahora 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
    miércoles, 7 de julio de 2010 18:04
  • Si lo que quieres es separar los bytes dada una posición, podrías hacer algo
    como:
     
    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ño
    del 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 }. ¿Te
    sirve algo así, o os entendí mal?
     
    Saludos.
     
     


    Fernando Gómez
    fermasmas.wordpress.com
    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

    jueves, 8 de julio de 2010 16:38
    Moderador
  • 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

    lunes, 12 de julio de 2010 18:52
    Moderador
  • 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 separarlo

    ahora 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
    miércoles, 7 de julio de 2010 18:04
  • Si lo que quieres es separar los bytes dada una posición, podrías hacer algo
    como:
     
    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ño
    del 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 }. ¿Te
    sirve algo así, o os entendí mal?
     
    Saludos.
     
     


    Fernando Gómez
    fermasmas.wordpress.com
    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 separarlo

    ahora 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 algo
    como:
     
    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ño
    del 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 }. ¿Te
    sirve 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 de
    datos. 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 tabla
    ImagenProducto 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 cada
    imagen (byte[]) en una colección, digamos, List<T>, y como decías la
    serializas 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); // serializado
     
    stream.Seek(0, SeekOrigin.Begin);
    list = f.Deserialize(stream) as List<byte[]>; // deserializado
    foreach (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, lo
    obtienes y lo pasas a un memory stream y lixto. Yo creo que con eso
    tendrías.
     
    Saludos.
     
     


    Fernando Gómez
    fermasmas.wordpress.com
    miércoles, 7 de julio de 2010 21:23
  • Hola. En mi opinión, sería mejor que normalizaras un poquito más tu base de
    datos. 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 tabla
    ImagenProducto 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 cada
    imagen (byte[]) en una colección, digamos, List<T>, y como decías la
    serializas 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); // serializado
     
    stream.Seek(0, SeekOrigin.Begin);
    list = f.Deserialize(stream) as List<byte[]>; // deserializado
    foreach (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, lo
    obtienes y lo pasas a un memory stream y lixto. Yo creo que con eso
    tendrí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

    jueves, 8 de julio de 2010 16:38
    Moderador
  • 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

    lunes, 12 de julio de 2010 18:52
    Moderador
  • 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