Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DouglasP

[Resolvido] Quebrar hexa

Recommended Posts

Boa tarde,

queria saber como quebrar uma string em partes,

por exemplo o seguinte hexa

0000FF00000000809195
queria por exemplo como fazer para alterar somente o 5 caracter que no caso é o primeiro F.

 

e como dividir varios hexa no caso

0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195
em campos de 20, ficando

 

0000FF00000000809195
FFFFFFFFFFFFFFFFFFFF
0000FF00000000809195

grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode usar str_split() para separar em string de um certo tamanho.

http://br.php.net/str_split

 

Para alterar apenas um caractere, pode tratar a string como um array, acessando a chave 4 para modificar o 5o. elemento (pois o primeiro é 0)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com str_split() você transforma uma string em um array onde cada índice terá a quantidade de caracteres que você especificar (se especificar) no segundo argumento.

 

No seu caso você faria:

 

$str = 'string hexadecimais grudados';

$hexas = str_split( $str, 6 ); // Aqui estamos desconsiderando hexas CSS de apenas três caracteres.

Ah! Peraí! Você quer em campos de 20 né? Então troca o 6 por 20 :P

 

Bois bem, depois disso. Pra trocar o quinto caracteres de todos esses grupos de 20,você faz um for básico memso:

 

for( $i = 0; $i < count( $hexas ); $i++ ) {
   // $i vai percorrendo cada índice do array "quebrado" por str_split
   // O último parâmetro passado para substr_replace não é o 5 que você quer porque a contagem começa no zero
   $hexas[ $i ] = substr_replace( $hexas[ $i ], 'novo valor', 4 );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso irei pegar esses dados de um campo varbinary, os dados estão em hexadecimal e o tamanho do campo é de 1080,

como posso ler eles e quebrar em 20 em 20?

e ai poder alterar um x caractere em uma determinada linha ou todas.

 

grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

queria saber como quebrar uma string em partes,

e como dividir varios hexa no caso

0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195
em campos de 20, ficando

 

 0000FF00000000809195
 FFFFFFFFFFFFFFFFFFFF
 0000FF00000000809195

Bom, eu usaria o preg_match:

 

$str = "0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195";
$arr = array();
$mtc = array();
if ( preg_match_all( "/[0-9a-f]{20}/i" , $str , $mtc ) ){
    $arr = $mtc[ 0 ];
}

var_dump( $arr );

Isso vai exibir:

 

array(7) {
  [0]=>
  string(20) "0000FF00000000809195"
  [1]=>
  string(20) "FFFFFFFFFFFFFFFFFFFF"
  [2]=>
  string(20) "0000FF00000000809195"
  [3]=>
  string(20) "FFFFFFFFFFFFFFFFFFFF"
  [4]=>
  string(20) "0000FF00000000809195"
  [5]=>
  string(20) "FFFFFFFFFFFFFFFFFFFF"
  [6]=>
  string(20) "0000FF00000000809195"
}

por exemplo o seguinte hexa

0000FF00000000809195
queria por exemplo como fazer para alterar somente o 5 caracter que no caso é o primeiro F.

 

Você pode acessar o índice que você quer modificar e atribuir o novo valor:

 

for ( $i = 0 , $t = count( $arr ) ; $i < $t ; $i++ ){
    $arr[ $i ]{ 0 } = "A";
    $arr[ $i ]{ 1 } = "B";
    $arr[ $i ]{ 2 } = "C";
}

var_dump( $arr );

Isso vai exibir:

 

array(7) {
  [0]=>
  string(20) "ABC0FF00000000809195"
  [1]=>
  string(20) "ABCFFFFFFFFFFFFFFFFF"
  [2]=>
  string(20) "ABC0FF00000000809195"
  [3]=>
  string(20) "ABCFFFFFFFFFFFFFFFFF"
  [4]=>
  string(20) "ABC0FF00000000809195"
  [5]=>
  string(20) "ABCFFFFFFFFFFFFFFFFF"
  [6]=>
  string(20) "ABC0FF00000000809195"
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem várias maneiras de fazer isso ai.Eu iria preferir fazer a nivel binário.

Dá uma olhada em operadores binários,funções de conversão de base e tipo e na função unpack.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu iria preferir fazer a nivel binário.

 

No PHP, com números desse tamanho ???

 

$num = 0xFFFFFFFFFFFFFFFFFFFF;

var_dump( $num & 0x1 ); //0
var_dump( $num >> 1 ); //0
var_dump( $num << 1 ); //0

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ou ainda diretamente com preg_split():

 

$hexas = preg_split( "/[0-9a-f]{20}/i", $str, -1, PREG_SPLIT_NO_EMPTY );

PREG_SPLIT_NO_EMPTY, aqui, foi só para garantir ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ João Batista Neto,

gostei do seu modo, ele inclusive ja tiro umas duvidas minhas,

 

aqui

array(7) {
  [0]=>
  string(20) "0000FF00000000809195"
  [1]=>
  string(20) "FFFFFFFFFFFFFFFFFFFF"
  [2]=>
  string(20) "0000FF00000000809195"
  [3]=>
  string(20) "FFFFFFFFFFFFFFFFFFFF"
  [4]=>
  string(20) "0000FF00000000809195"
  [5]=>
  string(20) "FFFFFFFFFFFFFFFFFFFF"
  [6]=>
  string(20) "0000FF00000000809195"
}

você poz para exibir apenas 7 partes quebradas,

no caso como eu faria para exibir todas?

que no caso o hexa varia entre 1200 caracteres ao total

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

gostei do seu modo, ele inclusive ja tiro umas duvidas minhas,

 

você poz para exibir apenas 7 partes quebradas,

no caso como eu faria para exibir todas?

que no caso o hexa varia entre 1200 caracteres ao total

 

O código abaixo é auto explicativo, executa ele:

 

/**
 * Inicio da geração da string de hexadecimais de 1200 caracteres
 */
$arr = array();

for ( $i = 0 , $j = 60 ; $i < $j ; $i++ ){
    $hex = array();

    for ( $k = 0 , $l = 20 ; $k < $l ; $k++ ){
        $hex[] = sprintf( "%X" , rand( 0 , 15 ) );
    }

    $arr[] = implode( "" , $hex );
}

$str = implode( "" , $arr ); //Aqui juntamos o hexa que geramos para virar uma string de 1200 caracteres
$arr = array();

if ( preg_match_all( "/[0-9a-f]{20}/i" , $str , $mtc ) ){
    $arr = $mtc[ 0 ];
}

var_dump( $arr );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eita pessoal que odeia a unpack...

E baptista...pra que expressões regulares?Já ouviu falar na str_split (no seu exemplo a própria unpack -.-)?

 

Ps: exemplo feio

Compartilhar este post


Link para o post
Compartilhar em outros sites

não faz sentido usar ER para quebrar strings por tamanho, onde não há regra de sintaxe que exige ER. O processamento da ER é maior que o de uma string, então usar str_split é mais rápido que split(), preg_split() ou mesmo preg_match().

Compartilhar este post


Link para o post
Compartilhar em outros sites

não faz sentido usar ER para quebrar strings por tamanho, onde não há regra de sintaxe que exige ER. O processamento da ER é maior que o de uma string, então usar str_split é mais rápido que split(), preg_split() ou mesmo preg_match().

 

Bom Beraldo, fiz um experimento aqui:

 

teste_strsplit.php

<?php
/**
 * Inicio da geração da string de hexadecimais de 1200 caracteres
 */
$arr = array();

for ( $i = 0 , $j = 60 ; $i < $j ; $i++ ){
    $hex = array();

    for ( $k = 0 , $l = 20 ; $k < $l ; $k++ ){
        $hex[] = sprintf( "%X" , rand( 0 , 15 ) );
    }

    $arr[] = implode( "" , $hex );
}

$str = implode( "" , $arr ); //Aqui juntamos o hexa que geramos para virar uma string de 1200 caracteres
$arr = str_split( $str , 20 );

var_dump( $arr );

teste_pregmatch.php

<?php
/**
 * Inicio da geração da string de hexadecimais de 1200 caracteres
 */
$arr = array();

for ( $i = 0 , $j = 60 ; $i < $j ; $i++ ){
    $hex = array();

    for ( $k = 0 , $l = 20 ; $k < $l ; $k++ ){
        $hex[] = sprintf( "%X" , rand( 0 , 15 ) );
    }

    $arr[] = implode( "" , $hex );
}

$str = implode( "" , $arr ); //Aqui juntamos o hexa que geramos para virar uma string de 1200 caracteres
$arr = array();

if ( preg_match_all( "/[0-9a-f]{20}/i" , $str , $mtc ) ){
    $arr = $mtc[ 0 ];
}

var_dump( $arr );

E abaixo o perfil de execução:

 

Imagem Postada

 

 

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Curioso... testei aqui com uma string estática (de 1200 caracteres) e o tempo de execução é o mesmo

 

 

códigos:

 

test_str_split.php

<?php

$hexa = 'B9205139E222A804FAA9FC8CB27890759A5FB889BBC63CB376C6243D7A61BD648C335BD1798B63ED9A4BF796208DDE16B49107280A36E148C84C0D32DB0BA1156B7729F243934EB07FD7C0AABA65B7B232A5C980C2311F28EFFBF95B3B0F3C27ECCB65C37F58F71D7086AE2E93EDF04EC193657E5C74382A9A1483226006154E6E1D48B943E8C025A4937C6ED64EB9C28DFC6B5AE33A450EAA216803E51AEDC6BC2178C6CF1051FFB112915877355FC0BF238F95FA54C54766A08F9F7C5CC2D810BAF4FFF54BA831FD27DB648B14DFCF08A0C9FCE389CBAB8C3679B05C42C12C9CC66B25FAEC687F4A5C40C9D1C92F6CB222E57E05A6D252CBE1BAA8C72E68A2BD4A3B9303AE5002BE479EF5524CAFE6D210EA3EDED3ED6ACA1691CF31BE095DC6EA029E062F48913B7CD4C15706154EC28D42B59E4D7EEA9677B380B86DEBBAE372637F1CD8AC342BBDE4EAD57B026E6D1C19C259B05E47A05943319AC9D2840A013C49609BFD39D822C53500FE382423560AF6A8196434D569A9FBAFAD8C1BF710216DA770CA49FB3A536F30DBCF6C78C99263AD4679074319778A75645D1C5D5F0C3BA72202946BEE368ACEF1C0D1E31E05AADCDEF73621457D04C06804AE7CD8183E50C48FBA0008D1DA13327D1FAF8B7BACC7146CE7DF0B1D521858668150DCC798EAC57BD4BDFCB5FCE454AD60E3DAA6291FE9ACD69D24210055503C12FEC95F36F2FAED07A2CD4DEA34B60C9FA59F5C64F5ED3E5E11B5FAF2FA9062F1891D6715D020E8EF9A5954C4F6468481E9E4009E0CEF4DEE837E8438A7F2C74A03F139F45E39C284602F458ED71AE55F841CD103F4DB750E';

$arr = str_split( $hexa, 20 );
?>

 

 

test_preg_match.php

<?php

$hexa = 'B9205139E222A804FAA9FC8CB27890759A5FB889BBC63CB376C6243D7A61BD648C335BD1798B63ED9A4BF796208DDE16B49107280A36E148C84C0D32DB0BA1156B7729F243934EB07FD7C0AABA65B7B232A5C980C2311F28EFFBF95B3B0F3C27ECCB65C37F58F71D7086AE2E93EDF04EC193657E5C74382A9A1483226006154E6E1D48B943E8C025A4937C6ED64EB9C28DFC6B5AE33A450EAA216803E51AEDC6BC2178C6CF1051FFB112915877355FC0BF238F95FA54C54766A08F9F7C5CC2D810BAF4FFF54BA831FD27DB648B14DFCF08A0C9FCE389CBAB8C3679B05C42C12C9CC66B25FAEC687F4A5C40C9D1C92F6CB222E57E05A6D252CBE1BAA8C72E68A2BD4A3B9303AE5002BE479EF5524CAFE6D210EA3EDED3ED6ACA1691CF31BE095DC6EA029E062F48913B7CD4C15706154EC28D42B59E4D7EEA9677B380B86DEBBAE372637F1CD8AC342BBDE4EAD57B026E6D1C19C259B05E47A05943319AC9D2840A013C49609BFD39D822C53500FE382423560AF6A8196434D569A9FBAFAD8C1BF710216DA770CA49FB3A536F30DBCF6C78C99263AD4679074319778A75645D1C5D5F0C3BA72202946BEE368ACEF1C0D1E31E05AADCDEF73621457D04C06804AE7CD8183E50C48FBA0008D1DA13327D1FAF8B7BACC7146CE7DF0B1D521858668150DCC798EAC57BD4BDFCB5FCE454AD60E3DAA6291FE9ACD69D24210055503C12FEC95F36F2FAED07A2CD4DEA34B60C9FA59F5C64F5ED3E5E11B5FAF2FA9062F1891D6715D020E8EF9A5954C4F6468481E9E4009E0CEF4DEE837E8438A7F2C74A03F139F45E39C284602F458ED71AE55F841CD103F4DB750E';

preg_match_all( "/[0-9a-f]{20}/i" , $hexa , $mtc );
$arr = $mtc[ 0 ];

?>

 

 

resultado dos testes:

beraldo@metropolis:~/www$ time php test_str_split.php 

real	0m0.028s
user	0m0.016s
sys	0m0.012s
beraldo@metropolis:~/www$ time php test_preg_match.php 

real	0m0.028s
user	0m0.016s
sys	0m0.012s
beraldo@metropolis:~/www$ time php test_str_split.php 

real	0m0.028s
user	0m0.024s
sys	0m0.004s
beraldo@metropolis:~/www$ time php test_preg_match.php 

real	0m0.028s
user	0m0.008s
sys	0m0.016s
beraldo@metropolis:~/www$ time php test_str_split.php 

real	0m0.028s
user	0m0.012s
sys	0m0.012s
beraldo@metropolis:~/www$ time php test_preg_match.php 

real	0m0.028s
user	0m0.012s
sys	0m0.016s
beraldo@metropolis:~/www$ time php test_str_split.php 

real	0m0.028s
user	0m0.016s
sys	0m0.012s
beraldo@metropolis:~/www$ time php test_preg_match.php 

real	0m0.028s
user	0m0.024s
sys	0m0.004s
beraldo@metropolis:~/www$ time php test_str_split.php 

real	0m0.028s
user	0m0.004s
sys	0m0.024s
beraldo@metropolis:~/www$ time php test_preg_match.php 

real	0m0.028s
user	0m0.020s
sys	0m0.004s
beraldo@metropolis:~/www$

O tempo real de execução insistiu em ficar em .028.

 

Processador AMD Phenom X4 2.2 GHz

 

 

PS: Que programa é esse que você utilizou para fazer os testes de tempo de execução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

PS: Que programa é esse que você utilizou para fazer os testes de tempo de execução?

 

É o profiler do Zend Studio, ele faz muuuuuito mais que só ver o tempo de execução, e o nome Zend já deve dar uma idéia do nível do programa: http://www.zend.com/en/products/studio/downloads

Compartilhar este post


Link para o post
Compartilhar em outros sites

Curioso... testei aqui com uma string estática (de 1200 caracteres) e o tempo de execução é o mesmo

O tempo real de execução insistiu em ficar em .028.

 

Isso é porque quando você usou o time do Linux ele levou em consideração também o tempo de carga do PHP, e o profiler pega apenas o tempo de execução do próprio script, mas aqui vai um novo perfil:

 

teste_pregmatch.php

<?php
function teste(){
    /**
     * Inicio da geração da string de hexadecimais de 1200 caracteres
     */
    $arr = array();

    for ( $i = 0 , $j = 60 ; $i < $j ; $i++ ){
        $hex = array();

        for ( $k = 0 , $l = 20 ; $k < $l ; $k++ ){
            $hex[] = sprintf( "%X" , rand( 0 , 15 ) );
        }

        $arr[] = implode( "" , $hex );
    }

    $str = implode( "" , $arr ); //Aqui juntamos o hexa que geramos para virar uma string de 1200 caracteres
    $arr = array();

    if ( preg_match_all( "/[0-9a-f]{20}/i" , $str , $mtc ) ){
        $arr = $mtc[ 0 ];
    }

    var_dump( $arr );
}

for ( $i = 0 , $t = 1000 ; $i < $t ; $i++ ){
    teste();
}

teste_strsplit.php

<?php
function teste(){
    /**
     * Inicio da geração da string de hexadecimais de 1200 caracteres
     */
    $arr = array();

    for ( $i = 0 , $j = 60 ; $i < $j ; $i++ ){
        $hex = array();

        for ( $k = 0 , $l = 20 ; $k < $l ; $k++ ){
            $hex[] = sprintf( "%X" , rand( 0 , 15 ) );
        }

        $arr[] = implode( "" , $hex );
    }

    $str = implode( "" , $arr ); //Aqui juntamos o hexa que geramos para virar uma string de 1200 caracteres
    $arr = str_split( $str , 20 );

    var_dump( $arr );
}

for ( $i = 0 , $t = 1000 ; $i < $t ; $i++ ){
    teste();
}

Como pode ver, estamos fazendo 1000 chamadas para cada método, o novo perfil para cada caso:

 

Imagem Postada

 

Imagem Postada

 

Caso alguém queira ver o relatório completo é só me mandar uma MP que eu passo o link.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu HL/LL benchmark foi diferente desse ai...

Não vou nem discutir.Se você realmente apoia o seu ponto de vista,quer dizer que você não faz muita idéia de como as coisas são implementadas e desculpa,mas tenho mais o que fazer do que discutir com gente assim...xP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.