Trabalhando com números em hexadecimal no DB2

Igor Escobar on Set 24th 2008

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 que o nosso cliente trabalha é uma base de dados DB2. Neste banco de dados tinha algumas tabelas que alguns campos eram 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 hehehe.

Brincadeiras à parte...
O valor correto seria este:

77142233249

O que acontece ai é o seguinte, o HEX retorna os valores compactados, com valores correspondentes a 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 é capaz de normalizar uma string que esteja neste formato e ser 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 acumula-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á substituido.
  • 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 codigo correspondente na tabela ASCII.

E é isso companheiros, espero que um dia possa salvar o dia de vocês (rsrs)

[]'s
Igor.

Leia também:

Aumente as chances do seu projeto/site dar certo on August 7th, 2008
O trabalho de concepção e amadurecimento de uma idéia é uma tarefa complicada.

Porquê semântica faz diferença! on May 15th, 2008
.

Porquê semântica faz diferença: Tag span on June 9th, 2008
.

O Google agora indexa Flash!...E DAI? on July 25th, 2008
Nesta semana, .

Porquê semântica faz diferença: Tag acronym on May 29th, 2008
.

Filed in Otimização, PHP, Utilidades | No responses yet

Trackback URI | Comments RSS

Leave a Reply