Ir al contenido


Foto

decodificar texto en base64 y construir un grafico.

base64 byte bits formato desconocido imagen

  • Por favor identifícate para responder
26 respuestas en este tema

#1 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 19 mayo 2018 - 02:29

Buenas tardes,

 

Hola foristas, escribo por lo siguiente:

 

Tengo un archivo codificado (proveniente de un aparato tecnológico usado en laboratorios clínicos). Resulta que dentro de todos los datos vienen cuatro imágenes que son dos tipos de gráficos como histogramas y diagramas de dispersión y vienen cifrados de tal forma que no se sabe si es una imagen, un gráfico o un vídeo, la cosa es que viene cifrado.

 

La cuestion es que ya he probado varios codigos pero nada que se me da y yo ya me hice bolas.

El meollo principal esta en que la imagen necesita ser construida byte por byte, porque de otra forma no resulta. (digo yo...).

 

En los campos de imágenes el cifrado es el siguiente (el que esta en negrilla):

 

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQIDAwQFBgYHCQsMEBQaISk2QVFhcYaarcHR5PH3//358eTYyrutmox7alxNQjYsJB4YFBAODAoJBwcGBQUFBQQEBAQDAwMDAwMDAwICAgICAgICAgICAgICAwMDAwMDAwMDAwICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==

(esto por colocar un ejemplo corto, hay mas extensos)

 

tengo adicional esta informacion: 

 

Table 12-18 Base64 mapping

D.4.6 Comunicación de datos binarios

Los datos del histograma se transmiten como datos binarios. En el segmento OBX, el valor de los datos tipo campo es "ED"; el valor de los datos está en la forma de "^ Aplicación ^ Octet-stream ^ Base64 ^ ...... datos de histograma ......"; "Aplicación" - aquí indica que los datos transmitidos son datos del programa de aplicación, "Octer-stream" - es el tipo de flujo de bytes, y "Base64" indica el método de codificación de los datos. Los datos binarios del diagrama de dispersión se transmiten de manera similar.

Comunicación de datos de mapa de bits Scattergram: en el segmento OBX, el valor del campo de tipo de datos es "ED"; el valor de los datos está en la forma de "^ Imagen ^ BMP ^ Base64 ^ ...... Mapa de bits scattergram datos……". La "Imagen ^

 

D.4.7 Base65 Coding

(1) Seleccione los 3 bytes adyacentes (es decir, 24 bits) de la secuencia de datos a codificar; de izquierda a derecha, divídalos en 4 grupos de 6 bits; luego, la cadena ASCII se obtiene mapeando de acuerdo con la Tabla 12-18.

 

(1) Seleccione los 3 bytes adyacentes (es decir, 24 bits) de la secuencia de datos a codificar; de izquierda a derecha, divídalos en 4 grupos de 6 bits; luego, la cadena ASCII se obtiene mapeando de acuerdo con la Tabla 12-18.

 

V/C   | V/C      | V/C      | V/C

0 A    | 17 R    | 34 I      | 51 z

1 B    | 18 S    | 35 j      | 52 0

2 C    | 19 T    | 36 k     | 53 1

3 D    | 20 U    | 37 l      | 54 2

4 E    | 21 V    | 38 m    | 55 3

5 F    | 22 W    | 39 n     | 56 4

6 G    | 23 X    | 40 o     | 57 5

7 H    | 24 Y    | 41 p     | 58 6

8 I      | 25 Z    | 42 q     | 59 7

9 J     | 26 a     | 43 r     | 60 8

10 K  |  27 b    |  44 s    | 61 9

11 L   |  28 c    |  45 t     | 62 +

12 M  |  29 d    |  46 u    | 63 /

13 N  |  30 e    |  47 v    | 

14 O  |  31 f     |  48 w   | (pad) =

15 P   |  32 g    |  49 x   | 

16 Q   |  33 h   |  50 y   | 

 

 

(2) Repita la codificación del procedimiento (1) continuamente hasta finalizar la codificación del flujo de datos.

Cuando los datos que quedan son menos de 3 bytes, 0 se usa para complementar a la derecha. Si el total de 6 bits

El grupo obtenido se compone de 0, luego se asigna al carácter "=". Cuando se deja un byte,

entonces la cadena de codificación obtenida consta de dos caracteres "="; cuando quedan dos bytes, entonces el

La cadena de codificación obtenida consta de un carácter "=". Los dos casos se demuestran a continuación:

 

Initial data 0AH

                                   00001010

  

Data obtained after complementing 00001010      00000000     00000000

6-bit groups obtained after dividing 000010            100000         000000      000000

Corresponding values                                02H 20H               00H           00H

Corresponding characters                           C                      g                    =                 =

 

 

Initial data 0AH 0BH

                                          00001010       00001011

 

Data obtained after complementing    00001010         00001011       00000000

6-bit groups obtained after dividing                      000010          100000           101100              000000

Corresponding values 02H 20H 2CH 00H

Corresponding characters C g                    s                       =

 

 

Agradezco infinitamente tu ayuda, porque realmente no se como hacerlo, haber si me puedes echar una mano.

yo pobre ese código haber si me resultaba una imagen decodificada en https://www.opiniona...s/Base64Decoderpero nada no me resulta nada. 

 

por favor, ayúdame, veo que eres pilo para este tema de construir imágenes .bmp o cualquier extensión con base64.

 

Ayuda!! por favor, tengo este requerimiento y no logro dar el como hacerlo, soy nueva en este tema de decodificar bytes... 

 

 

 


  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 19 mayo 2018 - 06:49

Buenas noches,

 

los datos que colocaste ahi no se corresponden con una imagen, al menos con ningun formato conocido (bmp, jpg, png, etc ...), mas bien parecen una serie de valores de una grafica.

 

Si decodificamos el base64 tenemos la siguiente lista de valores:


php
  1. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 3 3 4 5 6 6 7 9 11 12 16 20 26 33 41 54 65 81 97 113 134 154 173 193 209 228 241 247 255 253 249 241 228 216 202 187 173 154 140 123 106 92 77 66 54 44 36 30 24 20 16 14 12 10 9 7 7 6 5 5 5 5 4 4 4 4 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Que puestos sobre una grafica da la siguiente imagen:

Archivo adjunto  Sin título.jpg   27,66KB   5 descargas

 

Que tiene pinta de ser una medicion de algun tipo.

 

En resumen, que lo que tienes que haces es decodificar el base64 y pintar tu los valores sobre una grafica si quieres verlos.

 

Saludos


  • 1

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 20 mayo 2018 - 02:33

Y ahi va un ejemplo rápido de lo que decia

 

Saludos

Archivos adjuntos


  • 1

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 20 mayo 2018 - 01:20

Buenas noches,
 
los datos que colocaste ahi no se corresponden con una imagen, al menos con ningun formato conocido (bmp, jpg, png, etc ...), mas bien parecen una serie de valores de una grafica.
 
Si decodificamos el base64 tenemos la siguiente lista de valores:


delphi
  1. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 3 3 4 5 6 6 7 9 11 12 16 20 26 33 41 54 65 81 97 113 134 154 173 193 209 228 241 247 255 253 249 241 228 216 202 187 173 154 140 123 106 92 77 66 54 44 36 30 24 20 16 14 12 10 9 7 7 6 5 5 5 5 4 4 4 4 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Que puestos sobre una grafica da la siguiente imagen:
attachicon.gifSin título.jpg
 
Que tiene pinta de ser una medicion de algun tipo.
 
En resumen, que lo que tienes que haces es decodificar el base64 y pintar tu los valores sobre una grafica si quieres verlos.
 
Saludos


D.4.6 Comunicación de datos binarios
Los datos del histograma se transmiten como datos binarios. En el segmento OBX, el valor de los datos tipo campo es "ED"; el valor de los datos está en la forma de "^ Aplicación ^ Octet-stream ^ Base64 ^ ...... datos de histograma ......"; "Aplicación" - aquí indica que los datos transmitidos son datos del programa de aplicación, "Octer-stream" - es el tipo de flujo de bytes, y "Base64" indica el método de codificación de los datos. Los datos binarios del diagrama de dispersión se transmiten de manera similar.
Comunicación de datos de mapa de bits Scattergram: en el segmento OBX, el valor del campo de tipo de datos es "ED"; el valor de los datos está en la forma de "^ Imagen ^ BMP ^ Base64 ^ ...... Mapa de bits scattergram datos……". La "Imagen ^


Al parecer se trasmiten dos tipos de datos: 1º datos binarios y 2º datos de Mapa de bits.
 
Sobre los tatos que aporta tatiana fuentes bien pudiera ser lo que dices, seoane. Esos datos no son un formato gráfico pero, ya puestos a jugar,  cabe otra interpretación. Son 256 bytes que bien pudiera corresponder a una parte de un stream de un Bitmap, siendo el fragmento que nos muestra tatiana fuentes, una paleta de 64 colores, La imagen que te muestro es el resultado de considerar que es una paleta formada por cuadripetes (RGBQUAD) de la estructura BITMAPINFO. Sigue faltando la cabecera BITMAPINFOHEADER con los datos fundamentales del bmp, como son, su tamaño, biBitCount y demás.
 
En este caso, esta pudiera ser la imagen de la paleta:
 
854b1b05edb6e70ded6d2fde6a734756o.png


Aún así, me inclino a pensar que la interpretación de los datos expuestos que hace seoane es la correcta, pero seguramente otros fragmentos correspondan a un bitmap, como indica la información adicional.
 
 
Saludos.
  • 1

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 20 mayo 2018 - 05:19

Este es el código usado para obtener el gráfico mostrado de la hipotética paleta de colores
 

delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, ExtCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Image1: TImage;
  12. Memo1: TMemo;
  13. Button1: TButton;
  14. Label1: TLabel;
  15. procedure Button1Click(Sender: TObject);
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21.  
  22. var
  23. Form1: TForm1;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. function CryptStringToBinary(pszString: PAnsiChar; cchString: DWORD; dwFlags: DWORD;
  30. pbBinary: PByte; var pcbBinary: DWORD; pdwSkip: PDWORD;
  31. pdwFlags: PDWORD): BOOL; stdcall;
  32. external 'Crypt32.dll' name 'CryptStringToBinaryA';
  33.  
  34.  
  35. function StrB64ToStream(Str: String; MStream: TMemoryStream): boolean;
  36. var
  37. Size: DWORD;
  38. begin
  39. Result:= CryptStringToBinary(@Str[1], Length(Str), 1, 0, Size, nil, nil);
  40. if Result then
  41. begin
  42. MStream.SetSize(Size);
  43. Result:= CryptStringToBinary(@Str[1], Length(Str), 1, MStream.Memory, Size, nil, nil);
  44. end;
  45. end;
  46.  
  47. procedure TForm1.Button1Click(Sender: TObject);
  48. var
  49. MS: TMemoryStream;
  50. n: integer;
  51. P: PBYTE;
  52. begin
  53. MS:= TMemoryStream.Create;
  54. StrB64ToStream(Memo1.Text, MS);
  55. Label1.Caption:= IntToStr(MS.Size);
  56. Image1.Stretch:= false;
  57. Image1.Picture.Bitmap.PixelFormat:= pf32bit;
  58. Image1.Picture.Bitmap.Height:= 8;
  59. Image1.Picture.Bitmap.Width:= Image1.Picture.Bitmap.Height;
  60. P:= MS.Memory;
  61. for n:= 0 to Image1.Picture.Bitmap.Height - 1 do
  62. begin
  63. CopyMemory(Image1.Picture.Bitmap.ScanLine[n], P, 32);
  64. inc(P,32);
  65. end;
  66.  
  67. Image1.Stretch:= true;
  68. MS.Free;
  69. end;
  70.  
  71. end.

Saludos.

Archivos adjuntos


  • 2

#6 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 21 mayo 2018 - 08:43

Hola chicos, me acaban de salvar la vida laboral... jejej, de verdad este tema es nuevo para mí y me hice bolas y ya no sabia ni por donde a empezar a analizar el tema.

Revisare cuidadosamente la información y probare y comentare haber que tal me va. Gracias.


  • 0

#7 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 21 mayo 2018 - 10:30

Y ahi va un ejemplo rápido de lo que decia

 

Saludos

hola seone, intento correr el archivo que mandaste, ya lo cheque, y corregi, asumo que lo implementaste en una version superior a delphi 7, 

 

al recrearlo correctamente, funciono muchas gracias.


  • 0

#8 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 22 mayo 2018 - 10:36

Buenas noches,

 

los datos que colocaste ahi no se corresponden con una imagen, al menos con ningun formato conocido (bmp, jpg, png, etc ...), mas bien parecen una serie de valores de una grafica.

 

Si decodificamos el base64 tenemos la siguiente lista de valores:


php
  1. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 3 3 4 5 6 6 7 9 11 12 16 20 26 33 41 54 65 81 97 113 134 154 173 193 209 228 241 247 255 253 249 241 228 216 202 187 173 154 140 123 106 92 77 66 54 44 36 30 24 20 16 14 12 10 9 7 7 6 5 5 5 5 4 4 4 4 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Que puestos sobre una grafica da la siguiente imagen:

attachicon.gifSin título.jpg

 

Que tiene pinta de ser una medicion de algun tipo.

 

En resumen, que lo que tienes que haces es decodificar el base64 y pintar tu los valores sobre una grafica si quieres verlos.

 

Saludos

Seoane, efectivamente me arroja una gráfica, y resulta que estoy usando dephi 7, hice un plano cartesiano sin uso de componentes e intente escribir la decodificacion ''encima'' haber si podía, pero no me funciona... me late que podría usar los componentes tchart para este ejemplo pero no se como implementarlo, podrías echarme una mano... por favor...

 

Agradezco la ayuda de cualquier otra persona también, muchas gracias de antemano y gracias por leerme.


  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 mayo 2018 - 04:05

Un ejemplo sencillo con TChart:


delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, ActiveX, ExtCtrls, TeEngine, Series, Buttons,
  8. TeeProcs, Chart;
  9.  
  10. type
  11. TForm1 = class(TForm)
  12. Memo1: TMemo;
  13. Chart: TChart;
  14. Series1: TAreaSeries;
  15. Button1: TButton;
  16. procedure Button1Click(Sender: TObject);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22.  
  23. var
  24. Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. const
  31. CRYPT_STRING_BASE64 = 1;
  32.  
  33. function CryptStringToBinary(pszString: PAnsiChar; cchString: DWORD; dwFlags: DWORD;
  34. pbBinary: PByte; var pcbBinary: DWORD; pdwSkip: PDWORD;
  35. pdwFlags: PDWORD): BOOL; stdcall;
  36. external 'Crypt32.dll' name 'CryptStringToBinaryA';
  37.  
  38. //---------------------------------------------------------------------------
  39. // Decodifica una cadena Encode64 a su binario original en un TMemoryStream
  40. function StrB64ToStream(Str: String; MStream: TMemoryStream): boolean;
  41. var
  42. Size: DWORD;
  43. begin
  44. Result:= CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, nil, Size, nil, nil);
  45. if Result then
  46. begin
  47. MStream.SetSize(Size);
  48. Result:= CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, MStream.Memory, Size, nil, nil);
  49. end;
  50. end;
  51.  
  52.  
  53. procedure TForm1.Button1Click(Sender: TObject);
  54. var
  55. MS: TMemoryStream;
  56. Data: PAnsiChar;
  57. x: integer;
  58. begin
  59. MS:= TMemoryStream.Create;
  60. StrB64ToStream(Memo1.Text, MS);
  61. Data:= MS.Memory;
  62. for x:= 0 to MS.Size-1 do
  63. Chart.Series[0].Add(ORD(Data[x]), '', clAqua);
  64.  
  65. MS.Free;
  66. end;
  67.  
  68. end.

Saludos.

Archivos adjuntos


  • 2

#10 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 24 mayo 2018 - 10:53

hola, muchas gracias scandafra y seoane, he solucionado varias cosillas con la ayuda de ustedes y no reporte los ajustes y aqui hay una muestra de lo que he adelantado al respecto de la graficacion de los datos: https://subefotos.co...bf62348201o.png,

 

me olvide por completo mostrarles porque estoy intentando intentando mostrar un diagrama de dispersión correctamente, donde no he dado con la solución aún.
 
Ya me he familiarizado con varios tchar y la forma como implementarlos pero me encuentro estancada en este grafico que debo generar y nose como hacerlo, si alguien me hecha una mano estaría agradecida... 
 
el grafico al que debo llegar es este: https://subefotos.co...dbb38e1cd7o.png

 

y el grafico que me resulta al decodificar es este https://fotos.subefo...d76a4aef03o.png y no se parece en nada. 

 

la trama que estoy implementando es la siguiente: 


delphi
  1. AG8GaQEUADwGMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBIAAQ4SAAFIEgABbhIAAeISAAEJEwABDBMAAQ0TAAEPEwABEBMAARETAAEiEwABIxMAASYTAAEpEwABLBMAAS4TAAE7EwABThMAAQYVAAELFQABDBUAAQ4VAAESFQABLBUAATAVAAEzFQABPxUAAUAVAAGVFQABBhYAAQ4WAAEQFgABERYAARIWAAEVFgABGBYAASwWAAEzFgABNBYAAUMWAAFIFgABDhcAAQYYAAEIGAABDhgAAQ8YAAEwGAABMhgAAUIYAAFLGAABfxgAAQ8ZAAEQGQABEhkAARUZAAEsGQABSxkAAVUZAAFbGQABDxsAARIbAAETGwABGRsAATYbAAFIGwABrxsAAQwcAAETHAABFhwAASUcAAFGHAABTxwAAVIcAAFZHAABEB4AARIeAAE1HgABOx4AAUAeAAFbHgABXB4AAQsfAAEVHwABMB8AATEfAAFCHwABSx8AAU4fAAFTHwABEyAAARQgAAEgIAABVSAAARIiAAEVIgABNiIAAUYiAAFOIgABWCIAAQ8jAAEQIwABRiMAAQ4mAAEYJgABDygAARAoAAEWKAABFygAAQ8pAAEOMwABKykAASkrAAEvKwABPCsAASUsAAEmLAABKCwAASksAAErLAABLCwAATksAAEjLgABKy4AASwuAAEuLgABLy4AATAuAAEyLgABNS4AATYuAAE3LgABPC4AASMvAAEkLwABJS8AASYvAAEpLwABKi8AASsvAAEsLwABLS8AAS4vAAEvLwABMi8AATUvAAE2LwABNy8AATgvAAE7LwABIzAAASQwAAElMAABKTAAASswAAEsMAABLTAAAS4wAAEvMAABMDAAATEwAAEyMAABNjAAATcwAAE4MAABOTAAATowAAE8MAABPTAAAT8wAAFCMAABJTEAAS8xAAEwMQABNjEAATcxAAE4MQABPDEAAT8xAAFCMQABHzIAASAyAAEhMgABIzIAASQyAAElMgABJjIAAScyAAEoMgABKTIAASoyAAErMgABLDIAAS0yAAEuMgABLzIAATAyAAExMgABMjIAATMyAAE0MgABNTIAATYyAAE3MgABODIAATkyAAE6MgABOzIAATwyAAE9MgABPjIAAUAyAAEgMwABIjMAASMzAAEkMwABJTMAASYzAAEoMwABKTMAASozAAErMwABLDMAAS0zAAEuMwABLzMAATAzAAExMwABMjMAATMzAAE0MwABNTMAATYzAAE3MwABODMAATkzAAE6MwABOzMAATwzAAE+MwABPzMAAUAzAAFBMwABQzMAAUUzAAFGMwABIjQAASU0AAEoNAABKTQAASo0AAErNAABLDQAAS00AAEuNAABLzQAATA0AAEyNAABMzQAATQ0AAE1NAABNjQAATc0AAE4NAABOTQAATo0AAE7NAABPjQAAR81AAEgNQABIjUAASM1AAEkNQABJTUAASY1AAEnNQABKDUAASk1AAEqNQABKzUAASw1AAEtNQABLjUAAS81AAEwNQABMTUAATI1AAEzNQABNDUAATU1AAE2NQABNzUAATg1AAE5NQABOjUAATs1AAE8NQABPTUAAT41AAE/NQABQDUAAUE1AAFGNQABHjYAAR82AAEgNgABIjYAASM2AAEkNgABJTYAASY2AAEnNgABKDYAASk2AAEqNgABKzYAASw2AAEtNgABLjYAAS82AAEwNgABMTYAATI2AAEzNgABNDYAATU2AAE2NgABNzYAATg2AAE5NgABOjYAATs2AAE8NgABPTYAAT42AAFANgABQTYAAUM2AAFENgABRTYAAUY2AAEeNwABHzcAASI3AAEjNwABJDcAASU3AAEmNwABJzcAASg3AAEpNwABKjcAASs3AAEsNwABLTcAAS43AAEvNwABMDcAATE3AAEyNwABMzcAATQ3AAE1NwABNjcAATc3AAE4NwABOTcAATo3AAE7NwABPDcAAT03AAE+NwABQDcAAUU3AAEWOAABHDgAAR44AAEfOAABIDgAASE4AAEiOAABIzgAASQ4AAElOAABJjgAASc4AAEoOAABKTgAASo4AAErOAABLDgAAS04AAEuOAABLzgAATA4AAExOAABMjgAATM4AAE0OAABNTgAATY4AAE3OAABODgAATk4AAE6OAABOzgAATw4AAE9OAABPjgAAT84AAFCOAABRTgAARk5AAEeOQABHzkAASA5AAEhOQABIjkAASM5AAEkOQABJTkAASY5AAEnOQABKDkAASk5AAEqOQABKzkAASw5AAEtOQABLjkAAS85AAEwOQABMTkAATI5AAEzOQABNDkAATU5AAE2OQABNzkAATg5AAE5OQABOjkAATs5AAE8OQABPTkAAT45AAE/OQABQDkAAUE5AAFCOQABQzkAAUQ5AAFFOQABRjkAAR46AAEfOgABIDoAASE6AAEiOgABIzoAASQ6AAElOgABJjoAASc6AAEoOgABKToAASo6AAErOgABLDoAAS06AAEuOgABLzoAATA6AAExOgABMjoAATM6AAE0OgABNToAATY6AAE3OgABODoAATk6AAE6OgABOzoAATw6AAE9OgABPjoAAUA6AAFBOgABQjoAARk7AAEcOwABHTsAAR47AAEfOwABIDsAASE7AAEiOwABIzsAASQ7AAElOwABJjsAASc7AAEoOwABKTsAASo7AAErOwABLDsAAS07AAEuOwABLzsAATA7AAExOwABMjsAATM7AAE0OwABNTsAATY7AAE3OwABODsAATk7AAE6OwABOzsAATw7AAE9OwABPjsAAT87AAFAOwABQTsAAUI7AAFDOwABRTsAAUg7AAEYPAABGzwAARw8AAEdPAABHjwAAR88AAEgPAABITwAASI8AAEjPAABJDwAASU8AAEmPAABJzwAASg8AAEpPAABKjwAASs8AAEsPAABLTwAAS48AAEvPAABMDwAATE8AAEyPAABMzwAATQ8AAE1PAABNjwAATc8AAE4PAABOTwAATo8AAE7PAABPDwAAT08AAE+PAABPzwAAUA8AAFBPAABQjwAAUY8AAFIPAABGz0AARw9AAEdPQABHj0AAR89AAEgPQABIT0AASI9AAEjPQABJD0AASU9AAEmPQABJz0AASg9AAEpPQABKj0AASs9AAEsPQABLT0AAS49AAEvPQABMD0AATE9AAEyPQABMz0AATQ9AAE1PQABNj0AATc9AAE4PQABOT0AATo9AAE7PQABPD0AAT09AAE+PQABPz0AAUA9AAFCPQABGz4AARw+AAEdPgABHj4AAR8+AAEgPgABIT4AASI+AAEjPgABJD4AASU+AAEmPgABJz4AASg+AAEpPgABKj4AASs+AAEsPgABLT4AAS4+AAEvPgABMD4AATE+AAEyPgABMz4AATQ+AAE1PgABNj4AATc+AAE4PgABOT4AATo+AAE7PgABPD4AAT0+AAE+PgABPz4AAUA+AAFBPgABQj4AAUM+AAFEPgABRT4AAUg+AAEbPwABHD8AAR0/AAEePwABHz8AASA/AAEhPwABIj8AASM/AAEkPwABJT8AASY/AAEnPwABKD8AASk/AAEqPwABKz8AASw/AAEtPwABLj8AAS8/AAEwPwABMT8AATI/AAEzPwABND8AATU/AAE2PwABNz8AATg/AAE5PwABOj8AATs/AAE8PwABPT8AAT4/AAE/PwABQD8AAUE/AAFCPwABQz8AAUQ/AAFGPwABGUAAARpAAAEbQAABHEAAAR5AAAEfQAABIEAAASFAAAEiQAABI0AAASRAAAElQAABJkAAASdAAAEoQAABKUAAASpAAAErQAABLEAAAS1AAAEuQAABL0AAATBAAAExQAABMkAAATNAAAE0QAABNUAAATZAAAE3QAABOEAAATlAAAE6QAABO0AAATxAAAE9QAABP0AAAUBAAAFBQAABQkAAAUNAAAFFQAABG0EAAR5BAAEfQQABIEEAASFBAAEiQQABI0EAASRBAAElQQABJkEAASdBAAEoQQABKUEAASpBAAErQQABLEEAAS1BAAEuQQABL0EAATBBAAExQQABMkEAATNBAAE0QQABNUEAATZBAAE3QQABOEEAATlBAAE6QQABO0EAATxBAAE9QQABQEEAARlCAAEaQgABG0IAARxCAAEdQgABHkIAAR9CAAEgQgABIUIAASJCAAEjQgABJEIAASVCAAEmQgABJ0IAAShCAAEpQgABKkIAAStCAAEsQgABLUIAAS5CAAEvQgABMEIAATFCAAEyQgABM0IAATRCAAE1QgABNkIAATdCAAE4QgABOUIAATpCAAE7QgABPEIAAT1CAAE+QgABP0IAAUNCAAFEQgABSEIAARlDAAEbQwABHEMAAR1DAAEeQwABH0MAASBDAAEhQwABIkMAASNDAAEkQwABJUMAASZDAAEnQwABKEMAASlDAAEqQwABK0MAASxDAAEtQwABLkMAAS9DAAEwQwABMUMAATJDAAEzQwABNEMAATVDAAE2QwABN0MAAThDAAE5QwABOkMAATtDAAE8QwABPUMAAT5DAAE/QwABRUMAARtEAAEcRAABHUQAAR5EAAEfRAABIEQAASFEAAEiRAABI0QAASREAAElRAABJkQAASdEAAEoRAABKUQAASpEAAErRAABLEQAAS1EAAEuRAABL0QAATBEAAExRAABMkQAATNEAAE0RAABNUQAATZEAAE3RAABOEQAATlEAAE6RAABO0QAATxEAAE9RAABPkQAAT9EAAEZRQABGkUAARtFAAEcRQABHUUAAR5FAAEfRQABIEUAASFFAAEiRQABI0UAASRFAAElRQABJkUAASdFAAEoRQABKUUAASpFAAErRQABLEUAAS1FAAEuRQABL0UAATBFAAExRQABMkUAATNFAAE0RQABNUUAATZFAAE3RQABOEUAATlFAAE6RQABO0UAATxFAAE+RQABQEUAAUJFAAFDRQABRkUAARtGAAEcRgABHUYAAR5GAAEfRgABIEYAASFGAAEiRgABI0YAASRGAAElRgABJkYAASdGAAEoRgABKUYAASpGAAErRgABLEYAAS1GAAEuRgABL0YAATBGAAExRgABMkYAATNGAAE0RgABNUYAATZGAAE3RgABOEYAATlGAAE6RgABO0YAATxGAAE9RgABPkYAARtHAAEcRwABHUcAAR5HAAEfRwABIEcAASFHAAEiRwABI0cAASRHAAElRwABJkcAASdHAAEoRwABKUcAASpHAAErRwABLEcAAS1HAAEuRwABL0cAATBHAAExRwABMkcAATNHAAE0RwABNUcAATZHAAE3RwABOEcAATlHAAE6RwABO0cAATxHAAE9RwABPkcAARlIAAEaSAABG0gAARxIAAEdSAABHkgAAR9IAAEgSAABIUgAASJIAAEjSAABJEgAASVIAAEmSAABJ0gAAShIAAEpSAABKkgAAStIAAEsSAABLUgAAS5IAAEvSAABMEgAATFIAAEySAABM0gAATRIAAE1SAABNkgAATdIAAE4SAABOUgAATpIAAE7SAABPEgAAT5IAAE/SAABQEgAAUFIAAFDSAABRkgAARlJAAEaSQABG0kAARxJAAEdSQABHkkAAR9JAAEgSQABIUkAASJJAAEjSQABJEkAASVJAAEmSQABJ0kAAShJAAEpSQABKkkAAStJAAEsSQABLUkAAS5JAAEvSQABMEkAATFJAAEySQABM0kAATRJAAE1SQABNkkAATdJAAE4SQABOUkAATpJAAE7SQABPkkAARlKAAEaSgABG0oAARxKAAEdSgABHkoAAR9KAAEgSgABIUoAASJKAAEjSgABJEoAASVKAAEmSgABJ0oAAShKAAEpSgABKkoAAStKAAEsSgABLUoAAS5KAAEvSgABMEoAATFKAAEySgABM0oAATRKAAE2SgABN0oAAThKAAE5SgABOkoAATtKAAE+SgABGUsAARpLAAEbSwABHEsAAR1LAAEeSwABH0sAASBLAAEhSwABIksAASNLAAEkSwABJUsAASZLAAEnSwABKEsAASlLAAEqSwABK0sAASxLAAEtSwABLksAAS9LAAEwSwABMUsAATJLAAEzSwABNEsAATVLAAE2SwABN0sAAThLAAE5SwABOksAATtLAAFASwABQUsAAUVLAAEYTAABGUwAARpMAAEbTAABHEwAAR1MAAEeTAABH0wAASBMAAEhTAABIkwAASNMAAEkTAABJUwAASZMAAEnTAABKEwAASlMAAEqTAABK0wAASxMAAEtTAABLkwAAS9MAAEwTAABMUwAATJMAAEzTAABNEwAATVMAAE2TAABN0wAAThMAAE7TAABP0wAAUBMAAFCTAABG00AARxNAAEdTQABHk0AAR9NAAEgTQABIU0AASJNAAEjTQABJE0AASVNAAEmTQABJ00AAShNAAEpTQABKk0AAStNAAEsTQABLU0AAS5NAAEvTQABME0AATFNAAEyTQABM00AATRNAAE1TQABOE0AATtNAAEYTgABG04AARxOAAEdTgABHk4AAR9OAAEgTgABIU4AASJOAAEjTgABJE4AASVOAAEmTgABJ04AAShOAAEpTgABKk4AAStOAAEsTgABLU4AAS5OAAEvTgABME4AATFOAAEyTgABM04AATROAAE1TgABNk4AATdOAAE4TgABOU4AATtOAAE8TgABPU4AAT5OAAEZTwABG08AARxPAAEdTwABHk8AAR9PAAEgTwABIU8AASJPAAEjTwABJE8AASVPAAEmTwABJ08AAShPAAEpTwABKk8AAStPAAEsTwABLU8AAS5PAAEvTwABME8AATFPAAEyTwABM08AATRPAAE1TwABNk8AATdPAAE4TwABOU8AATpPAAE/TwABRU8AARtQAAEcUAABHVAAAR5QAAEfUAABIFAAASFQAAEiUAABI1AAASRQAAElUAABJlAAASdQAAEoUAABKVAAASpQAAErUAABLFAAAS1QAAEuUAABL1AAATBQAAExUAABMlAAATNQAAE0UAABNVAAATZQAAE5UAABPFAAAT5QAAE/UAABG1EAARxRAAEdUQABHlEAAR9RAAEgUQABIVEAASJRAAEjUQABJFEAASVRAAEmUQABJ1EAAShRAAEpUQABKlEAAStRAAEsUQABLVEAAS5RAAEvUQABMFEAATNRAAE0UQABNVEAAT9RAAEZUgABG1IAARxSAAEdUgABHlIAAR9SAAEgUgABIVIAASJSAAEjUgABJFIAASVSAAEmUgABJ1IAAShSAAEpUgABKlIAAStSAAEsUgABLVIAAS5SAAEvUgABMFIAATFSAAEyUgABM1IAATRSAAE1UgABNlIAAThSAAE5UgABOlIAATtSAAE8UgABPVIAAT5SAAEYUwABHFMAAR1TAAEeUwABH1MAASBTAAEhUwABIlMAASNTAAEkUwABJVMAASZTAAEnUwABKFMAASlTAAEqUwABK1MAASxTAAEtUwABL1MAATBTAAExUwABMlMAATVTAAE2UwABN1MAATlTAAE7UwABPFMAAT5TAAE/UwABQFMAARxUAAEdVAABHlQAAR9UAAEgVAABIVQAASJUAAEjVAABJFQAASVUAAEmVAABJ1QAAShUAAEpVAABKlQAAStUAAEsVAABLVQAAS9UAAEcVQABHVUAAR5VAAEfVQABIFUAASFVAAEiVQABI1UAASRVAAElVQABJlUAASdVAAEoVQABKVUAASpVAAErVQABLFUAAS5VAAEvVQABM1UAATRVAAE1VQABNlUAATlVAAE6VQABO1UAAT5VAAFAVQABGVYAARxWAAEdVgABHlYAAR9WAAEgVgABIVYAASJWAAEjVgABJFYAASVWAAEmVgABJ1YAAShWAAEpVgABKlYAAStWAAEsVgABLVYAAS5WAAEvVgABMFYAATFWAAEzVgABNlYAAThWAAE5VgABQFYAAUFWAAEcVwABHVcAAR5XAAEfVwABIFcAASFXAAEiVwABI1cAASRXAAElVwABJlcAASdXAAEoVwABKVcAASpXAAErVwABLFcAAS1XAAEuVwABL1cAARtYAAEcWAABHlgAAR9YAAEgWAABIVgAASJYAAEjWAABJFgAASVYAAEmWAABJ1gAAShYAAEpWAABKlgAAStYAAEsWAABLlgAAS9YAAEwWAABMVgAATJYAAE1WAABNlgAATdYAAEeWQABH1kAASBZAAEhWQABIlkAASNZAAEkWQABJVkAASZZAAEnWQABKFkAASlZAAEqWQABK1kAAS9ZAAE1WQABOFkAAR5aAAEfWgABI1oAASRaAAElWgABJloAASdaAAEoWgABKVoAASpaAAE4WgABIFsAASFbAAElWwABKFsAASxbAAEtWwABMFsAATFbAAE4WwABHFwAAR1cAAEfXAABI1wAASRcAAElXAABJlwAASdcAAEpXAABKlwAAS5cAAE1XAABH10AASVdAAEpXQABNV0AAR5eAAEfXgABIF4AASNeAAEkXgABJV4AASleAAEqXgABLl4AAS9eAAEyXgABOV4AAR5fAAEgXwABIV8AASJfAAEoXwABKV8AASpfAAErXwABLF8AAS1fAAEuXwABL18AATBfAAExXwABOF8AAR9gAAEpYAABKmAAAStgAAEsYAABLWAAAS9gAAEwYAABKWEAAR5iAAEfYgABIGIAASNiAAElYgABJmIAASdiAAEoYgABLmIAAS9iAAEyYgABM2IAAR9jAAEjYwABKGMAASxjAAEtYwABLmMAAS9jAAEwYwABM2MAAS9kAAEeZQABIGUAASFlAAEiZQABI2UAASVlAAEmZQABKGUAASllAAEqZQABK2UAASxlAAEwZQABOGUAATtlAAE8ZQABH2YAAShmAAEpZgABK2YAASxmAAEuZgABL2YAATVmAAE2ZgABOWYAAShnAAEoaAABK2gAASxoAAEtaAABLmgAAS9oAAEyaAABNmgAATtoAAE8aAABJWkAASZpAAEpaQABPGkAAT9pAAElagABJmsAASlrAAEqawABLGsAATNrAAE1awABOWsAATprAAE8awABJWwAASZsAAEpbAABK2wAATVsAAE2bAABPmwAASttAAE1bQABI24AASluAAEsbgABLW4AATNuAAE4bgABPG4AASZvAAErbwABLG8AATZvAAE3bwABOW8AASZwAAEncAABMHAAATFwAAEycAABJXIAATJyAAEfcwABJXMAAShzAAEpcwABMnMAAR51AAEidQABJnUAAS51AAEvdQABNXUAAR92AAEgdgABInYAAR54AAE2eAABJXYAASl2AAEvdgABIHgAASh4AAEseAABLngAATV4AAEoeQABNnkAARx7AAEeewABInsAASl7AAEqewABMHsAATJ7AAEzewABOHsAAR98AAEjfAABJXwAASx8AAEyfAABHH4AASB+AAEifgABJX4AASh+AAErfgABL34AATh+AAEffwABIn8AASV/AAEofwABKX8AASp/AAEufwABL38AATB/AAE1fwABNn8AATh/AAEjgAABKYAAASyAAAEygAABM4AAASCCAAEjggABJYIAASaCAAEoggABKYIAASuCAAEsggABLoIAAS+CAAEwggABMoIAATWCAAE2ggABN4IAASCDAAEigwABI4MAASWDAAEmgwABK4MAAS+DAAEygwABOIMAAS+EAAEihQABJYUAASyFAAEthQABMIUAATGFAAEfhgABIoYAASWGAAEphgABKoYAASuGAAEuhgABM4YAATiGAAE5hgABKIgAASmIAAEviAABMogAARuJAAEliQABKYkAASuJAAEyiQABM4kAATSJAAE1iQABOYkAASuKAAEyigABM4oAARyLAAEiiwABJYsAASmLAAEqiwABLIsAAS2LAAEuiwABL4sAATKLAAEziwABNosAASOMAAEljAABJowAASeMAAEojAABKYwAASuMAAEujAABMIwAATGMAAE2jAABOYwAAS6NAAEfjgABJo4AASeOAAEojgABKY4AASyOAAEujgABL44AATKOAAEzjgABOI4AASKPAAEjjwABJo8AASePAAEpjwABLI8AAS+PAAEyjwABNo8AASKQAAEjkAABJJAAASaQAAEnkAABKZAAASuQAAEskAABLZAAATOQAAE0kAABNZAAATmQAAErkQABIJIAASGSAAEikgABK5IAASySAAEtkgABL5IAATCSAAEykgABM5IAATSSAAE2kgABN5IAATiSAAElkwABK5MAASyTAAEtkwABMpMAATWTAAE4kwABK5QAATWUAAE4lAABHJUAASCVAAEilQABJpUAASeVAAEolQABKZUAAS+VAAEwlQABMpUAATOVAAE1lQABH5YAASCWAAEilgABJZYAASaWAAEplgABLJYAAS6WAAEvlgABMJYAATOWAAE1lgABNpYAAS6XAAEvlwABNZcAASOYAAEomAABKZgAASqYAAEumAABMJgAATGYAAEzmAABNJgAATiYAAEfmQABIJkAASOZAAEpmQABLJkAAS2ZAAEumQABL5kAATCZAAExmQABMpkAATOZAAE0mQABNZkAATWaAAEomwABLpsAATWbAAEinAABJpwAASicAAErnAABLpwAASudAAEjngABL54AATOeAAE0ngABNZ4AASifAAEpnwABK58AAS+fAAEynwABIqAAASOgAAEooAABLKAAAS6gAAEvoAABMKAAATKgAAEvoQABJaIAASaiAAErogABJqMAASyjAAEpqAAByFYAAeJbAAGlXAAB31wAAeVcAAHjXwAB/GIAAcVlAAHzZQABz2YAAa9oAAGyaAABz2gAAdxoAAG/aQAB32kAAaNrAAHvawABxWwAAb9uAAHcbgAB724AAc5vAAHibwABwHAAAdtwAAHMcwABy3UAAZt4AAGieAAByXgAAfZ4AAH3eAABjHkAAY15AAGgeQABv3kAAYN7AAHeewABknwAAZZ8AAHAfAABwnwAAdV8AAGIfgABkH8AAb5/AAGPgAABroAAAYaDAAGFhQABz4YAAeKJAAHwiQABmY8AAZ6PAAHFkAABr5IAAZ6WAAGmnAABSWsAAUhsAAFIbgABRm8AAV5yAAFGcwABR3MAAV9zAAFgcwABQHUAAUZ1AAFIdQABS3UAATx2AAFGdgABPHgAAUB4AAFCeAABS3gAAU94AAE5eQABRXkAAUZ5AAFOeQABQnsAAUV7AAFPewABPHwAAUJ8AAFofAABP34AAUJ+AAFDfgABZX4AAUx/AAFQfwABU38AAVl/AAFlfwABaX8AAT6AAAFOgAABUIAAAVGAAAFWgAABWIAAAWOAAAFogAABPoEAAT+CAAFAggABQoIAAUWCAAFIggABTIIAAVWCAAFYggABWYIAAWCCAAFGgwABSYMAAUuDAAFTgwABfoMAATyFAAE+hQABQoUAAUWFAAFMhQABUIUAAVGFAAFThQABWIUAAVmFAAFehQABYIUAAXyFAAF+hQABPIYAAT6GAAFGhgABT4YAAVCGAAFYhgABWYYAAVuGAAFshgABbYYAAXyGAAE/iAABQIgAAUOIAAFIiAABSYgAAU6IAAFPiAABUIgAAVGIAAFSiAABVYgAAVmIAAFsiAABbYgAATuJAAFAiQABRYkAAUmJAAFOiQABUIkAAVKJAAFViQABWIkAAVmJAAFciQABY4kAAWWJAAFpiQABa4kAAX6JAAE7igABZYoAAUCLAAFCiwABRosAAUmLAAFKiwABTIsAAU6LAAFTiwABVIsAAVWLAAFYiwABXosAAV+LAAFliwABZosAAWeLAAFsiwABe4sAATuMAAFDjAABRIwAAUmMAAFLjAABTIwAAU+MAAFSjAABU4wAAVmMAAFbjAABXIwAAV2MAAFfjAABYIwAAXmMAAFSjQABPI4AAT+OAAFDjgABRI4AAUWOAAFJjgABS44AAUyOAAFNjgABUI4AAVmOAAFfjgABYI4AAWOOAAFojgABaY4AAWuOAAE/jwABQI8AAUKPAAFGjwABR48AAUiPAAFJjwABSo8AAUuPAAFMjwABTo8AAVKPAAFTjwABVY8AAVaPAAFYjwABX48AAWKPAAFmjwABaY8AAW6PAAFvjwABco8AAXmPAAF7jwABPJAAAT6QAAFAkAABQZAAAUKQAAFIkAABSZAAAUqQAAFLkAABTpAAAU+QAAFTkAABVJAAAVWQAAFWkAABV5AAAViQAAFZkAABWpAAAVuQAAFckAABYpAAAWOQAAFkkAABZZAAAWiQAAFpkAABapAAAWuQAAFwkAABcZAAAXWQAAFCkQABTpEAAVaRAAFXkQABWJEAAVmRAAFakQABY5EAAWiRAAFrkQABcJEAAXGRAAF1kQABPpIAAUOSAAFFkgABSJIAAU6SAAFQkgABUZIAAVKSAAFTkgABVZIAAVaSAAFYkgABWZIAAVqSAAFbkgABXJIAAV6SAAFfkgABYpIAAWaSAAFokgABa5IAAW+SAAFwkgABcZIAAXKSAAF8kgABO5MAATyTAAE+kwABQpMAAUOTAAFFkwABRpMAAUeTAAFLkwABTJMAAU2TAAFOkwABT5MAAVKTAAFTkwABVJMAAVWTAAFWkwABWJMAAV6TAAFfkwABYJMAAWWTAAFpkwABa5MAAW6TAAFvkwABcJMAAXGTAAF1kwABdpMAAXiTAAF8kwABRpQAAUeUAAFLlAABTpQAAVWUAAFYlAABXpQAAWWUAAFrlAABcJQAAXGUAAE5lQABOpUAATuVAAE8lQABPZUAAT6VAAFClQABRZUAAUaVAAFHlQABSJUAAUmVAAFLlQABTJUAAU6VAAFPlQABVZUAAVaVAAFXlQABWJUAAVmVAAFblQABXJUAAV6VAAFflQABYJUAAWGVAAFilQABY5UAAWWVAAFmlQABaZUAAWqVAAFrlQABbJUAAW2VAAFwlQABcpUAAXaVAAF4lQABeZUAAX+VAAE5lgABO5YAATyWAAE9lgABPpYAAT+WAAFDlgABRJYAAUWWAAFGlgABR5YAAUiWAAFLlgABTpYAAU+WAAFQlgABUpYAAVOWAAFVlgABVpYAAVeWAAFYlgABWZYAAVuWAAFclgABXZYAAV6WAAFflgABYJYAAWGWAAFilgABY5YAAWSWAAFllgABZpYAAWeWAAFolgABa5YAAXCWAAFylgABdpYAAXmWAAGAlgABjJYAAUOXAAFElwABRZcAAUaXAAFHlwABTpcAAVKXAAFVlwABVpcAAVeXAAFYlwABXJcAAV2XAAFflwABYJcAAWGXAAFilwABY5cAAWSXAAFllwABaJcAAWuXAAFylwABQJgAAUGYAAFCmAABRpgAAUiYAAFJmAABSpgAAUuYAAFMmAABTZgAAU6YAAFPmAABUJgAAVKYAAFTmAABVJgAAVWYAAFWmAABV5gAAViYAAFZmAABW5gAAVyYAAFdmAABXpgAAV+YAAFgmAABYZgAAWKYAAFjmAABZJgAAWWYAAFomAABa5gAAWyYAAFumAABb5gAAXKYAAFzmAABdJgAAXWYAAGCmAABhZgAATiZAAE7mQABQJkAAUGZAAFDmQABSJkAAUmZAAFLmQABTJkAAU2ZAAFOmQABT5kAAVCZAAFRmQABUpkAAVOZAAFVmQABVpkAAVeZAAFYmQABWZkAAVqZAAFbmQABXJkAAV2ZAAFemQABX5kAAWCZAAFhmQABYpkAAWOZAAFkmQABZZkAAWaZAAFomQABaZkAAWqZAAFrmQABbJkAAW2ZAAFumQABb5kAAXCZAAFxmQABc5kAAXSZAAF7mQABfJkAAX6ZAAGAmQABg5kAAYmZAAGOmQABSJoAAVCaAAFRmgABUpoAAVaaAAFXmgABW5oAAVyaAAFdmgABXpoAAV+aAAFimgABY5oAAWSaAAFlmgABa5oAAWyaAAFtmgABbpoAAW+aAAFwmgABcZoAAXOaAAE4mwABO5sAATybAAE9mwABP5sAAUCbAAFCmwABQ5sAAUWbAAFJmwABSpsAAUubAAFMmwABTZsAAU6bAAFPmwABUJsAAVGbAAFSmwABU5sAAVSbAAFVmwABVpsAAVebAAFZmwABWpsAAVubAAFcmwABXZsAAV6bAAFfmwABYJsAAWGbAAFimwABY5sAAWSbAAFlmwABZpsAAWebAAFpmwABa5sAAWybAAFtmwABbpsAAW+bAAFwmwABcZsAAXKbAAFzmwABdJsAAXabAAF3mwABeJsAAXubAAF8mwABf5sAAYKbAAGImwABi5sAAYybAAGTmwABO5wAAT+cAAFCnAABQ5wAAUScAAFFnAABRpwAAUecAAFInAABSZwAAUqcAAFLnAABTJwAAU2cAAFOnAABT5wAAVCcAAFRnAABUpwAAVOcAAFUnAABVZwAAVacAAFXnAABWJwAAVmcAAFanAABW5wAAVycAAFdnAABXpwAAV+cAAFgnAABYpwAAWOcAAFknAABZZwAAWacAAFnnAABaJwAAWmcAAFqnAABa5wAAWycAAFtnAABb5wAAXCcAAFxnAABcpwAAXOcAAF1nAABdpwAAXecAAF4nAABeZwAAXqcAAF8nAABfpwAAX+cAAGAnAABg5wAAYWcAAGGnAABi5wAAT+dAAFLnQABTp0AAU+dAAFQnQABUZ0AAVKdAAFVnQABVp0AAVedAAFZnQABWp0AAVydAAFdnQABX50AAWKdAAFjnQABZJ0AAWWdAAFmnQABZ50AAWidAAFpnQABap0AAWudAAFsnQABbZ0AAXCdAAFxnQABcp0AAXWdAAF4nQABP54AAUCeAAFBngABQ54AAUSeAAFFngABSJ4AAUmeAAFLngABTJ4AAU2eAAFOngABT54AAVCeAAFSngABU54AAVSeAAFVngABWJ4AAVmeAAFangABW54AAVyeAAFdngABXp4AAV+eAAFgngABYp4AAWOeAAFkngABZZ4AAWaeAAFnngABaJ4AAWmeAAFqngABa54AAWyeAAFtngABbp4AAW+eAAFwngABcZ4AAXKeAAFzngABdJ4AAXWeAAF5ngABfJ4AAX6eAAF/ngABg54AAYWeAAGIngABiZ4AATafAAE3nwABOJ8AAT6fAAE/nwABQJ8AAUKfAAFGnwABR58AAUifAAFJnwABS58AAUyfAAFOnwABT58AAVCfAAFRnwABUp8AAVOfAAFUnwABVp8AAVefAAFbnwABXp8AAV+fAAFgnwABYZ8AAWKfAAFjnwABZJ8AAWWfAAFmnwABZ58AAWifAAFpnwABap8AAWufAAFsnwABbZ8AAW6fAAFwnwABcZ8AAXWfAAF2nwABeZ8AAXufAAF8nwABfp8AAX+fAAGAnwABhZ8AAYafAAGHnwABOKAAATmgAAE+oAABP6AAAUCgAAFCoAABRqAAAUmgAAFMoAABT6AAAVCgAAFSoAABU6AAAVSgAAFVoAABVqAAAVegAAFYoAABWaAAAVqgAAFboAABXKAAAV2gAAFeoAABX6AAAWCgAAFhoAABYqAAAWOgAAFkoAABZaAAAWagAAFnoAABaKAAAWmgAAFqoAABa6AAAWygAAFtoAABbqAAAW+gAAFwoAABcaAAAXKgAAFzoAABdaAAAXagAAF3oAABeaAAAXqgAAF7oAABfqAAAX+gAAGCoAABg6AAAYSgAAGGoAABiaAAAYugAAE4oQABUqEAAVOhAAFUoQABVaEAAVahAAFXoQABWKEAAVuhAAFeoQABX6EAAWChAAFhoQABYqEAAWOhAAFkoQABZaEAAWihAAFpoQABaqEAAWuhAAFsoQABbaEAAW6hAAFvoQABcqEAAXWhAAF5oQABe6EAAX+hAAE1ogABNqIAATeiAAE+ogABP6IAAUCiAAFDogABSKIAAUmiAAFLogABTKIAAU2iAAFOogABT6IAAVCiAAFRogABUqIAAVOiAAFWogABV6IAAViiAAFZogABWqIAAVuiAAFcogABXaIAAV6iAAFfogABYKIAAWGiAAFiogABY6IAAWSiAAFlogABZqIAAWeiAAFpogABaqIAAWuiAAFsogABbaIAAW6iAAFvogABcKIAAXGiAAFyogABc6IAAXSiAAF1ogABdqIAAXeiAAF7ogABfKIAAX2iAAF+ogABf6IAAYCiAAGBogABg6IAAYaiAAGIogABiaIAAYuiAAGTogABMqMAATujAAFCowABQ6MAAUWjAAFGowABR6MAAUijAAFJowABS6MAAUyjAAFNowABTqMAAU+jAAFTowABVaMAAVajAAFYowABW6MAAVyjAAFdowABXqMAAV+jAAFgowABYaMAAWKjAAFjowABZKMAAWWjAAFoowABaaMAAWqjAAFrowABbKMAAW2jAAFuowABb6MAAXCjAAFxowABcqMAAXOjAAF0owABdaMAAXijAAF7owABfKMAAX2jAAF+owABgKMAAYOjAAGIowABRaQAAUakAAFIpAABS6QAAUykAAFPpAABW6QAAVykAAFdpAABXqQAAV+kAAFipAABY6QAAWSkAAFlpAABaKQAAWmkAAFrpAABbKQAAW2kAAFupAABb6QAAXKkAAFzpAABeKQAATOlAAE5pQABO6UAAT6lAAFApQABQqUAAUWlAAFGpQABSKUAAUmlAAFLpQABT6UAAVClAAFSpQABU6UAAVSlAAFVpQABVqUAAVilAAFbpQABXKUAAV2lAAFepQABX6UAAWClAAFhpQABYqUAAWOlAAFkpQABZaUAAWalAAFnpQABaKUAAWmlAAFqpQABa6UAAWylAAFtpQABbqUAAW+lAAFwpQABcaUAAXKlAAFzpQABdKUAAXWlAAF2pQABeKUAAXmlAAF8pQABfqUAAX+lAAGCpQABg6UAAYSlAAGFpQABhqUAAYilAAGSpQABk6UAATKmAAE/pgABQKYAAUKmAAFDpgABRKYAAUWmAAFIpgABSaYAAUumAAFMpgABUKYAAVGmAAFSpgABU6YAAVSmAAFVpgABVqYAAVemAAFYpgABWaYAAVumAAFcpgABXaYAAV6mAAFfpgABYKYAAWGmAAFipgABY6YAAWSmAAFlpgABZqYAAWemAAFopgABaaYAAWqmAAFrpgABbKYAAW2mAAFupgABb6YAAXCmAAFxpgABcqYAAXOmAAF0pgABdqYAAXimAAF5pgABeqYAAXumAAF+pgABg6YAAYSmAAGGpgABh6YAAUWnAAFIpwABS6cAAVKnAAFbpwABXKcAAV2nAAFepwABX6cAAWCnAAFhpwABYqcAAWOnAAFkpwABZacAAWmnAAFqpwABa6cAAWynAAFtpwABbqcAAW+nAAFwpwABcqcAAXOnAAF4pwABfqcAATCoAAE4qAABQKgAAUKoAAFDqAABSKgAAUmoAAFMqAABTagAAU6oAAFQqAABU6gAAVWoAAFWqAABWKgAAVmoAAFaqAABW6gAAVyoAAFeqAABX6gAAWCoAAFhqAABYqgAAWOoAAFkqAABZagAAWaoAAFnqAABaKgAAWuoAAFsqAABbagAAW6oAAFvqAABcKgAAXGoAAFyqAABc6gAAXSoAAF1qAABdqgAAXeoAAF5qAABeqgAAXuoAAF+qAABf6gAAYCoAAGBqAABg6gAAYSoAAGIqAABj6gAAZKoAAGTqAABNakAAUipAAFMqQABTqkAAU+pAAFQqQABUakAAVKpAAFTqQABVakAAVmpAAFaqQABW6kAAVypAAFdqQABXqkAAV+pAAFgqQABYakAAWKpAAFjqQABZKkAAWipAAFpqQABaqkAAWupAAFsqQABbakAAW6pAAFvqQABcKkAAXWpAAF2qQABeKkAAXupAAF+qQABgKkAAYOpAAGIqQABi6kAAY+pAAGWqQABSKoAAU6qAAFPqgABVaoAAWCqAAFhqgABYqoAAWOqAAFoqgABa6oAAWyqAAFtqgABbqoAAW+qAAF1qgABe6oAAX6qAAEoqwABKasAATyrAAE+qwABQKsAAUOrAAFGqwABSKsAAU6rAAFQqwABU6sAAVSrAAFWqwABV6sAAVirAAFZqwABWqsAAVurAAFcqwABXasAAV6rAAFgqwABYqsAAWOrAAFkqwABZasAAWarAAFnqwABa6sAAWyrAAFtqwABbqsAAW+rAAFwqwABcasAAXOrAAF0qwABdasAAXarAAF3qwABeKsAAXmrAAF7qwABfKsAAX2rAAGAqwABhqsAAYurAAGVqwABK6wAATusAAFJrAABSqwAAU6sAAFPrAABUKwAAVKsAAFTrAABVKwAAVasAAFbrAABXKwAAV6sAAFgrAABYqwAAWOsAAFlrAABZqwAAWesAAForAABaawAAWysAAFurAABcKwAAXGsAAFyrAABc6wAAXSsAAF1rAABdqwAAXmsAAF6rAABe6wAAXysAAF+rAABf6wAAYCsAAGDrAABhawAAYisAAGOrAABj6wAATutAAFlrQABZq0AAWitAAF1rQABjq0AATiuAAE7rgABPK4AAUKuAAFFrgABSa4AAUquAAFLrgABTK4AAU2uAAFOrgABUq4AAVOuAAFWrgABWa4AAVyuAAFdrgABXq4AAV+uAAFirgABY64AAWWuAAForgABa64AAW6uAAFvrgABcq4AAXauAAF3rgABf64AAYCuAAGCrgABha4AAYauAAE2rwABOa8AAT+vAAFDrwABUq8AAVWvAAFbrwABXK8AAV+vAAFgrwABYa8AAWKvAAFlrwABaa8AAWuvAAFsrwABba8AAW+vAAFyrwABc68AAXSvAAF8rwABfq8AAYavAAGHrwABQrAAAUOwAAFFsAABTrAAAU+wAAFQsAABUbAAAVKwAAFWsAABWbAAAVuwAAFcsAABXbAAAV6wAAFfsAABZrAAAWmwAAFssAABbrAAAW+wAAFwsAABcbAAAXOwAAF1sAABdrAAAYCwAAGBsAABhbAAAUKxAAFPsQABUrEAAVuxAAFcsQABX7EAAW6xAAF1sQABQ7IAAUayAAFIsgABSbIAAU6yAAFPsgABULIAAVayAAFYsgABW7IAAVyyAAFdsgABYLIAAWOyAAFksgABZbIAAWayAAFosgABabIAAWuyAAFusgABb7IAAXWyAAF4sgABe7IAAXyyAAGAsgABQ7MAAUmzAAFPswABULMAAVKzAAFWswABV7MAAWCzAAFiswABZrMAAWezAAFpswABa7MAAW6zAAFyswABc7MAAXWzAAF5swABe7MAAW60AAFAtQABTLUAAU61AAFVtQABX7UAAWK1AAFltQABaLUAAW61AAFwtQABc7UAAXS1AAF5tQABfrUAAUO2AAFMtgABT7YAAVm2AAFetgABY7YAAWu2AAF7tgABTLgAAU64AAFbuAABXLgAAV24AAFeuAABYrgAAWa4AAFwuAABcbgAAVC5AAFSuQABU7kAAVu5AAFouQABa7kAAUy7AAFVuwABW7sAAWC7AAFiuwABY7sAAWW7AAFPvAABYLwAAWK8AAFivQABVb4AAVi+AAFjvgAB

estaba pensando en si es posible establecer las coordenadas XY en el plano en base a los datos decodificados, pero no tengo idea por donde puedo empezar a implementar el tema.

 

Muchas gracias.

 

que debería implementar en delphi 7? ya he leido documentos de tchar... pero no aparecen ejemplos de este tipo, agradezco de antemano todas sus ayudas.


  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 mayo 2018 - 03:46

Hay un problema en la interpretación de los datos. Hasta ahora se ha asumido que cada byte era un valor y que solo hay una serie de datos. Eso supone que los valores son enteros y van de 0 a 255 o de -128 a 127 si consideramos signo. Esto puede no ser una interpretación correcta de los datos. Al decodificar la cadena encode64 obtenemos un bloque binario que puede considerarse como on array de Bytes, pero también de otro tipo (WORD, DWORD, float...) También hemos asumido que el eje Y varía en unidades enteras, pero los datos bien pudieran ser parejas (X, Y). Tampoco sabemos si todo el bloque pertenece a una serie o son varias ni como se reparte. En algún sitio debe haber información adicional que te oriente.

 

Cuando subas bloques tan largos, deberías hacerlo en un archivo de texto para evitar que el editor del foro te juegue pasadas. Veo tu texto con retorno de línea. ¿Eso significa un error, o marca los cambios de serie?

 

Saludos.


  • 0

#12 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 25 mayo 2018 - 07:43

muchas gracias, escandrafa, lo tendre en cuenta, para la proxima.


  • 0

#13 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 25 mayo 2018 - 04:52

Pues llevo un rato dandole vueltas y no me cuadra.

 

Siguiendo el manual del aparato (o creo que es el parato en cuestion porque no indicas el modelo), tenemos que cada grupo de 4 bytes se compone de XYVV donde X e Y son las coordenadas y VV el valor que se representa. Si miramos el ejemplo que envias solo hay valores 0 y 1 asi que la imagen es imposible que tenga varios colores. A mi como mucho me saldria algo como la imagen que adjunto.

 

Archivo adjunto  imagen.png   3,79KB   3 descargas

 

El codigo que use fue este:


delphi
  1. procedure TfrmMain.btnDibujarClick(Sender: TObject);
  2. var
  3. bitmap: TBitmap;
  4. datos: PWordArray;
  5. i, len: Integer;
  6. x, y: Integer;
  7. v: array[0..$FFFF] of Integer;
  8. begin
  9. if Length(Trim(txtData.Lines.Text)) > 0 then
  10. begin
  11. datos:= PWordArray(StrToBin(txtData.lines.Text, len, true));
  12. try
  13. if (datos <> nil) and (len > 0) then
  14. begin
  15. bitmap:= TBitmap.Create;
  16. try
  17. bitmap.PixelFormat:= pf32bit;
  18. bitmap.Height:= 256;
  19. bitmap.Width:= 256;
  20. bitmap.Canvas.Brush.Color:= clBlack;
  21. bitmap.Canvas.FillRect(bitmap.Canvas.ClipRect);
  22. for i:= 0 to (len div 2) - 1 do
  23. begin
  24. if i mod 2 = 0 then
  25. begin
  26. x:= datos[i] and $FF;
  27. y:= 256 - (datos[i] shr 8);
  28. end else
  29. begin
  30. if datos[i] > 0 then
  31. bitmap.Canvas.Pixels[x,y]:= RGB(255, 255, 255);
  32. end;
  33. end;
  34. imgGrafica.Picture.Assign(bitmap);
  35. finally
  36. bitmap.Free;
  37. end;
  38. end;
  39. finally
  40. FreeMem(datos);
  41. end;
  42. end;
  43. end;

Y hasta aqui llego, no se que mas se puede hacer

 

 


  • 0

#14 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 26 mayo 2018 - 07:46

Pues llevo un rato dandole vueltas y no me cuadra.

 

Siguiendo el manual del aparato (o creo que es el parato en cuestion porque no indicas el modelo), tenemos que cada grupo de 4 bytes se compone de XYVV donde X e Y son las coordenadas y VV el valor que se representa. Si miramos el ejemplo que envias solo hay valores 0 y 1 asi que la imagen es imposible que tenga varios colores. A mi como mucho me saldria algo como la imagen que adjunto.

 

attachicon.gifimagen.png

 

El codigo que use fue este:


delphi
  1. procedure TfrmMain.btnDibujarClick(Sender: TObject);
  2. var
  3. bitmap: TBitmap;
  4. datos: PWordArray;
  5. i, len: Integer;
  6. x, y: Integer;
  7. v: array[0..$FFFF] of Integer;
  8. begin
  9. if Length(Trim(txtData.Lines.Text)) > 0 then
  10. begin
  11. datos:= PWordArray(StrToBin(txtData.lines.Text, len, true));
  12. try
  13. if (datos <> nil) and (len > 0) then
  14. begin
  15. bitmap:= TBitmap.Create;
  16. try
  17. bitmap.PixelFormat:= pf32bit;
  18. bitmap.Height:= 256;
  19. bitmap.Width:= 256;
  20. bitmap.Canvas.Brush.Color:= clBlack;
  21. bitmap.Canvas.FillRect(bitmap.Canvas.ClipRect);
  22. for i:= 0 to (len div 2) - 1 do
  23. begin
  24. if i mod 2 = 0 then
  25. begin
  26. x:= datos[i] and $FF;
  27. y:= 256 - (datos[i] shr 8);
  28. end else
  29. begin
  30. if datos[i] > 0 then
  31. bitmap.Canvas.Pixels[x,y]:= RGB(255, 255, 255);
  32. end;
  33. end;
  34. imgGrafica.Picture.Assign(bitmap);
  35. finally
  36. bitmap.Free;
  37. end;
  38. end;
  39. finally
  40. FreeMem(datos);
  41. end;
  42. end;
  43. end;

Y hasta aqui llego, no se que mas se puede hacer

 

HOLA, sos un Crack!! llevo 4 días intentando hacerlo y leyendo del tema y en definitivas, no encontraba por donde hacerlo...

es evidente que tu solución se acerca mucho mas que la mía... a la gráfica requerida (que son 4 de este tipo) y pues GRACIAS :) me has ayudado un monton!.


  • 0

#15 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 26 mayo 2018 - 07:55

Hola, de verdad se te nota la experiencia y el conocimiento que tienes al respecto del software delphi... te debo muchísimo. y me gustaría me recomendaras y/o pasaras un libro o documento en pdf, donde pueda tener conocimientos al respecto de estos temas de delphi 7. no se porque en mi delphi 7 ... la ayuda me aparece bloqueada y no puedo acceder a ella desde windows :( ...

 

 

Gracias por ayudar a una novata como yo :).


  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 mayo 2018 - 09:25

Hola Tatiana Fuentes,

El libro que más se recomienda para aprender Delphi es La Cara Oculta de Delphi 4. Parecerá un poco viejo pero creeme que excelente para familiarizarse con Delphi. Explica en ABC y más.

El libro es de distribución gratuita ya que su autor ha cedido los derechos. Lo puedes descargar desde muchos sitios sin problemas.

 

También en el foro tenemos toda una sección dedicada a Manuales y Tutoriales, y más que pueden complementar a lo que leas. En el Foro Colaboración vas a entoncrar material que puede serte de guía.

 

Y no temas preguntar. ¡Que para eso existe el foro!

 

Ahora más en concreto para este caso, sobre el último mensaje del compañero Seoane, me parece que lo más importante de aprender es justamente lo que hace aquí:


delphi
  1. begin
  2. bitmap:= TBitmap.Create;
  3. try
  4. bitmap.PixelFormat:= pf32bit;
  5. bitmap.Height:= 256;
  6. bitmap.Width:= 256;
  7. bitmap.Canvas.Brush.Color:= clBlack;
  8. bitmap.Canvas.FillRect(bitmap.Canvas.ClipRect);
  9. for i:= 0 to (len div 2) - 1 do
  10. begin
  11. if i mod 2 = 0 then
  12. begin
  13. x:= datos[i] and $FF;
  14. y:= 256 - (datos[i] shr 8);
  15. end else
  16. begin
  17. if datos[i] > 0 then
  18. bitmap.Canvas.Pixels[x,y]:= RGB(255, 255, 255);
  19. end;
  20. end;
  21. imgGrafica.Picture.Assign(bitmap);
  22. finally
  23. bitmap.Free;
  24. end;
  25. end;

La magia que realiza el for más interno y da forma al "diagrama de dispersión" en  (x,y) puede parecer de otro nivel pero tiene su ciencia. Son cosas que se consiguen con la práctica. Tu también puedes hacerlo, dedicándole el tiempo.

Estudia su algoritmo y pregúntate ¿que hace en realidad para calcular (x,y) ? ¿Que significará el AND $FF y/o el SHR 8? ¿O porqué hace una evaluación de si el número es divisible por 2 y dependiendo de ello hace una u otra cosa?

 

Yo en lo personal hubiera usado el método basado en Scanline() en lugar de optar por la forma Pixels[], ya que estoy más acostumbrado a él, aunque el código sería un poco más complicado. En cambio con Pixels[] no hace falta estar jugando con punteros y se vuelve más "legible" el posicionamiento en un pixel en particular basandose en sus coordenadas. Son gustos. Con ambas técnicas se puede trabajar.

Si quieres saber más sobre como es que se construye una imagen como la que expuso el compañero busca en el foro sobre filtros de imagen, scanline y/o Pixels[]. Recuerdo que en otras ocasiones se habló un poco del tema y hay código de ejemplos.

 

Saludos,


  • 0

#17 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 27 mayo 2018 - 10:15

Siguiendo el manual del aparato (o creo que es el parato en cuestion porque no indicas el modelo), tenemos que cada grupo de 4 bytes se compone de XYVV donde X e Y son las coordenadas y VV el valor que se representa. Si miramos el ejemplo que envias solo hay valores 0 y 1 asi que la imagen es imposible que tenga varios colores. A mi como mucho me saldria algo como la imagen que adjunto.


Caramba, parece que seoane encontró la información que faltaba para interpretar los datos. Por lo que entiendo de la explicación de seoane y veo en los datos decodificados, los valores son un tanto absurdos pues siempre valen 1, con lo que en definitiva se trata de una lista de coordenadas que tienen valor. El resto no lo tendrán.
Es curioso como comienza la secuencia de Bytes:

delphi
  1. 00 6F 06 69 01 14 00 3C 06 33 00 00 00 00 00 00
  2. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3. 00 00 00 00

Después la secuencia adquiere al sentido XYVV obteniendo siempre valores de 1 ó 100h, si consideramos un VV como un WORD. Los primeros 34 bytes parecen ser una cabecera, pero sin la información del fabricante y con un solo ejemplo, es difícil de interpretar.
 
Sin considerar ese grupo como una cabecera y entrando en la interpretación de lo que parece claro como un grupo de coordenadas + valor XYVV, propongo un código que quizás Tatiana comprenda mejor.
 
El siguiente código usa una estructura definida a partir de la interpretación XYVV y decodifica con la API de Windows:

delphi
  1. const
  2. CRYPT_STRING_BASE64 = 1;
  3.  
  4. function CryptStringToBinary(pszString: PAnsiChar; cchString: DWORD; dwFlags: DWORD;
  5. pbBinary: PByte; var pcbBinary: DWORD; pdwSkip: PDWORD;
  6. pdwFlags: PDWORD): BOOL; stdcall;
  7. external 'Crypt32.dll' name 'CryptStringToBinaryA';
  8.  
  9. //---------------------------------------------------------------------------
  10. // Decodifica una cadena Encode64 a su binario original en un TMemoryStream
  11. function StrB64ToStream(Str: String; MStream: TMemoryStream): boolean;
  12. var
  13. Size: DWORD;
  14. begin
  15. Result:= CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, nil, Size, nil, nil);
  16. if Result then
  17. begin
  18. MStream.SetSize(Size);
  19. Result:= CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, MStream.Memory, Size, nil, nil);
  20. end;
  21. end;
  22.  
  23. type
  24. TData = record
  25. X, Y: BYTE;
  26. V: WORD;
  27. end;
  28. TAData = array [0..0] of TData;
  29. PAData = ^TAData;
  30.  
  31. procedure TForm1.Button1Click(Sender: TObject);
  32. var
  33. MS: TMemoryStream;
  34. Data: PAData;
  35. i, N: integer;
  36. begin
  37. MS:= TMemoryStream.Create;
  38. StrB64ToStream(Memo1.Text, MS);
  39. N:= MS.Size div sizeof(TData);
  40. Data:= MS.Memory;
  41. with Image1.Picture.Bitmap do
  42. begin
  43. PixelFormat:= pf32bit;
  44. Height:= 256;
  45. Width:= 256;
  46. Canvas.Brush.Color:= clBlack;
  47. Canvas.FillRect(Canvas.ClipRect);
  48. for i:= 0 to N-1 do
  49. Canvas.Pixels[Data[i].X, 256-Data[i].Y]:= Data[i].V;
  50. end;
  51. MS.Free;
  52. end;

Por si se prefiere la implemantación de seoane de su decodificador Base64, el código quedaría bastante similar:

delphi
  1. type
  2. TData = record
  3. X, Y: BYTE;
  4. V: WORD;
  5. end;
  6. TAData = array [0..0] of TData;
  7. PAData = ^TAData;
  8.  
  9.  
  10. procedure TForm1.Button2Click(Sender: TObject);
  11. var
  12. Data: PAData;
  13. i, N: integer;
  14. begin
  15. Data:= PAData(StrToBin(Memo1.Text, N, true));
  16. N:= N div sizeof(TData);
  17. with Image1.Picture.Bitmap do
  18. begin
  19. PixelFormat:= pf32bit;
  20. Height:= 256;
  21. Width:= 256;
  22. Canvas.Brush.Color:= clBlack;
  23. Canvas.FillRect(Canvas.ClipRect);
  24. for i:= 0 to N-1 do
  25. Canvas.Pixels[Data[i].X, 256-Data[i].Y]:= Data[i].V;
  26. end;
  27. FreeMem(Data);
  28. end;

En este caso, al ser un conjunto de coordenadas XY que no tienen porqué ser secuenciales, no veo mucho interés en usar ScanLine que sería mucho más apropiado para datos secuenciales con un reflejo lineal en la memoria de datos del BitMap
 
Saludos.
  • 2

#18 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 27 mayo 2018 - 03:57

Por si le interesa a alguien seguir mirando el tema, aqui dejo el pdf que use, que Tatiana podra confirmar si se trata de este aparato o no.

 

Saludos

Archivos adjuntos


  • 2

#19 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 29 mayo 2018 - 02:26

ohhh, seoane, claro que si, es ese aparato... y efectivamente pues sus ayudas son demasiado valiosas para mi, use como referencia lo que seoane me ha estado indicando y enseñando en este foro, sin embargo estamos a la espera de imagenes capturadas por el aparato, para contrastar mejor... (cuestiones de validaciones) haber si estamos generando efectivamente la grafica q generamos. tambien esta el tema de los colores... que creo se puede recorrer el array de bits... pero a todas estas parece q me surgen ideas... pero me embolato a la hora de plasmarlas en programación....

 

Estoy ahora terminando un proyecto de la U en php, pero apenas tenga el rato y concluya con validaciones, este codigo, les estare comentando... 

 

Su ayuda ha sido de gran valor para mi. :)... 

 

estare apareciendo nuevamente para finalmente reportar como quedo todo.


  • 0

#20 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 mayo 2018 - 04:21

Tendría que ponerme a leer la documentación que nos pasó seoane para entender como es el tema de esa grafica de dispersión, y ponerme a estudiar mejor en como se presenta los datos.

Pero en principio, si la estructura de los datos sigue la forma XYVV no hay forma de distinguir que "serie" es.

 

A lo que apunto, y a como yo estoy interpretando y entendiendo la imagen en colores que nos muestras, es que cada color representa a una serie de datos. Para asignar un color a la tercia (X,Y,VV) se necesita justamente una referencia adicional.

Es decir, nos falta un parámetro adicional... Debiera de ser (X,Y,VV,S) siendo S un valor que indique la serie. Y de esta forma para cada valor diferente de S le asignamos un color.

S podría ser de 1 byte, 2 bytes... Lo importante es poder saber si es que ese S que nos falta está presente en ese flujo de datos. ¿Puede que sea justamente (o al menos parte de) la info de "cabecera" que nos comentaba escafandra?

Si es así, ya tendríamos todo y añadirle color ya es un paso relativamente menor.

 

Ahora, si no está presente ese S, la pregunta es ¿De donde lo sacamos?

 

Saludos,


  • 0




IP.Board spam blocked by CleanTalk.