Back-End

26 set, 2008

Trabalhando com números em hexadecimal no DB2

Publicidade

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