PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → WX - Compactar Hexadecimal (Modulo, Array e outras paradinhas...)
WX - Compactar Hexadecimal (Modulo, Array e outras paradinhas...)
Started by BOLLER, May, 18 2017 7:51 PM - 1 reply
Registered member
3,651 messages
Popularité : +175 (223 votes)
Posted on May, 18 2017 - 7:51 PM
Prezados,

Compactar Hexadecimal (Modulo, Array e outras paradinhas...)

Procedure CompactarHexa(HexaDecimal)

//Exemplo
//HexaDecimal = "0FFFFFF1 0FFFFFF1 0FFFFFF1 FFFFFFF2 FFFFFFF2 FFFFFFF2 FFFFFFF2 FFFFFFF2"


//Passo 1
HexaDecimal = BufferToHexa(HexaDecimal,4) //Aplica agrupamento de 4 Bytes per Word

HexaDecimal = Replace(HexaDecimal," ","") //Remove espaço

HexaDecimal = Replace(HexaDecimal,CRLF,"") //Remove Enter ascii 13, 10

HexaDecimal = Replace(HexaDecimal,CR,"") //Remove Enter ascii 13

Pos, Contador, Ultimo is int = 0

ArrNewHexadecimal is array of string

HexaAtual, UltimoHexa is string = ""

nTotal is int = Length(HexaDecimal)

LOOP (nTotal)

Pos += 1

IF Modulo(Pos,8) = 1 OR Modulo(Pos,8) = 8 THEN
HexaAtual = Middle(HexaDecimal,Pos,8)
IF UltimoHexa = HexaAtual THEN
Contador += 1
Ultimo = ArrayCount(ArrNewHexadecimal)
ArrNewHexadecimal[Ultimo] = "["+Contador+"]"+HexaAtual
ELSE IF UltimoHexa <> HexaAtual THEN
Contador = 1
Add(ArrNewHexadecimal,"["+Contador+"]"+HexaAtual)
UltimoHexa = HexaAtual
END

END

END

//Passo 2
nRegistros is int = 0

HexadecimalSerializado is string = ""

QtdeHexadecimalSuprimida is int = ArrayCount(ArrNewHexadecimal)

LOOP (QtdeHexadecimalSuprimida)

nRegistros += 1

HexadecimalSerializado += ArrNewHexadecimal[nRegistros]

END

RESULT HexadecimalSerializado


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modified, May, 18 2017 - 8:03 PM
Registered member
3,651 messages
Popularité : +175 (223 votes)
Posted on May, 18 2017 - 9:51 PM
Exemplo CompactarHexadecimal do Boller

Pego um arquivo (doc, jpg,....)
1- converto para base64
2 -depois para hexa
3 - aplico a minha tecnica acima
4 - zipo
5 - transmito pelo webservie e faço o inverso na outra ponta

é baseado em um arquivo binário que foi convertido para BASE64 para evitar caracteres inválidos e gerou isso aqui:

E011CFD0 E11AB1A1 00000000 00000000
00000000 00000000 0003003E 0009FFFE
00000006 00000000 00000000 00000004
000001AE 00000000 00001000 000001B0
00000001 FFFFFFFE 00000000 000001AA
000001AB 000001AC 000001AD FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
00C1A5EC 0416E063 12F80000 000000BF
10000000 00000000 00000800 00000802
6A62000E AD3A6A62 0000AD3A

É igual a 1284 caracteres o length acima


Caso nao queira ter [1] é possivel reduzir ainda mais assim:

...

HexadecimalSerializado = Replace(HexadecimalSerializado,"[1]","")

RESULT HexadecimalSerializado

Sem essa linha da isso:

[1]E011CFD0[1]E11AB1A1[4]00000000[1]0003003E[1]0009FFFE[1]00000006[2]00000000[1]00000004[1]000001AE[1]00000000[1]00001000[1]000001B0[1]00000001[1]FFFFFFFE[1]00000000[1]000001AA[1]000001AB[1]000001AC[1]000001AD[105]FFFFFFFF[1]00C1A5EC[1]0416E063[1]12F80000[1]000000BF[1]10000000[1]00000000[1]00000800[1]00000802[1]6A62000E[1]AD3A6A62[1]0000AD3A

É igual a 343 caracteres o length acima

Com essa linha

HexadecimalSerializado = Replace(HexadecimalSerializado,"[1]","")

fica assim:

E011CFD0E11AB1A1[4]000000000003003E0009FFFE00000006[2]0000000000000004000001AE0000000000001000000001B000000001FFFFFFFE00000000000001AA000001AB000001AC000001AD[105]FFFFFFFF00C1A5EC0416E06312F80000000000BF100000000000000000000800000008026A62000EAD3A6A620000AD3A

É igual a 259 caracteres o length acima

Se se zipar de 259 vai para 196 bytes...

Todo binario é convertido facilmente em hexa, uma vez em hexa tem um padrão de repetições que agrupo com o cochete

[3]FFFFFFFF

é igual a

FFFFFFFF FFFFFFFF FFFFFFFF

a olho nu é visivel que a minha tecnica do cochete é menor

se tiver

[150]FFFFFFFF

é 150 x FFFFFFFF FFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFF FFFFFFF FFFFFFFF....

Espero que ajude em suas aplicações esse exemplo.

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modified, May, 18 2017 - 10:51 PM