Olá a todos! Hoje vou apresentar para vocês um problema que apareceu para resolvermos aqui no trabalho, que é o seguinte:
A base de dados em que o nosso cliente trabalha é uma base de dados DB2. Neste banco de dados havia algumas tabelas com campos compactados (high-values) em hexadecimal.
Para poder converter os valores destas colunas, o DB2 conta com uma função chamada HEX(). Por exemplo:
SELECT HEX(KCPE) as MeuHex, CP08, CP10 FROM entidade.base;
Este código vai gerar uma coluna chamada MeuHex que vai retornar valores como este:
Ãñðð÷÷ñôòòóóòôùÆôðôð
Ou seja, salve-se quem puder!
Brincadeiras à parte…
O valor correto seria este:
77142233249
O que acontece aí é o seguinte: o HEX retorna os valores compactados, com valores correspondentes à tabela ASCII, só que na sua escala mais alta (high-values) ou ASCII tabela extendida (como preferirem), de 128 a 255.
Meu trabalho foi desenvolver uma função que fosse capaz de normalizar uma string que estivesse neste formato e fosse compreendida pelo ser humano, trazendo o seu “real” valor.
Segue a função:
1. /**
2. * Normalização DB2 High-Values para ACSII Padrão
3. * @author Igor Escobar (blog@igorescobar.com.br)
4. * @version 1.0 24/09/2008 $
5. */
6. function hex2ascii($hexvar){
7. $aux = "";
8. $hex = array(240 => 0, 241 => 1, 242 => 2, 243 => 3, 244 => 4, 245 => 5, 246 => 6, 247 => 7, 248 => 8, 249 => 9);
9. for ($i=4;$i<15;$i++)
10. $aux .= $hex[ord(substr($hexvar,$i,1))];
11. return $aux;
12. }
Vou explicar para você como funciona este programa:
- Primeiro eu crio uma variável aux para poder trabalhar com ela e acumulá-la mais tarde
- Depois eu crio um array, para usar como uma tabela de tradução, seu indice é o valor correspondente na tabela ASCII e o seu valor é o valor no qual será substituído
- Depois eu crio um loop para caminhar em cada byte da string passada e fazer a sua tradução
- Obs: A função ord() do php recebe um caracter e retorna o seu código correspondente na tabela ASCII.
E é isso, companheiros. Espero que um dia possa salvar o dia de vocês!
[]’s