DouglasP 1 Denunciar post Postado Agosto 15, 2009 Boa tarde, queria saber como quebrar uma string em partes, por exemplo o seguinte hexa 0000FF00000000809195queria por exemplo como fazer para alterar somente o 5 caracter que no caso é o primeiro F. e como dividir varios hexa no caso 0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195em campos de 20, ficando 0000FF00000000809195 FFFFFFFFFFFFFFFFFFFF 0000FF00000000809195 grato. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 15, 2009 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
DouglasP 1 Denunciar post Postado Agosto 16, 2009 não entendi mto bem amigo, poderia me explicar um exemplo de como quebrar o hexa e alterar um caractere x? Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Agosto 16, 2009 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
Beraldo 864 Denunciar post Postado Agosto 16, 2009 $hexa = '0xffff'; $hexa[4] = 'a'; echo $hexa; // resulta em 0xffaf http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
DouglasP 1 Denunciar post Postado Agosto 16, 2009 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
Beraldo 864 Denunciar post Postado Agosto 16, 2009 como posso ler eles e quebrar em 20 em 20? e ai poder alterar um x caractere em uma determinada linha ou todas. veja [anchorlink=1361515]o post do Imaggens[/anchorlink] Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Agosto 17, 2009 queria saber como quebrar uma string em partes, e como dividir varios hexa no caso 0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195FFFFFFFFFFFFFFFFFFFF0000FF00000000809195em 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 0000FF00000000809195queria 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
eibon 2 Denunciar post Postado Agosto 17, 2009 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
João Batista Neto 448 Denunciar post Postado Agosto 17, 2009 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
Bruno Augusto 417 Denunciar post Postado Agosto 17, 2009 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
DouglasP 1 Denunciar post Postado Agosto 19, 2009 @ 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
João Batista Neto 448 Denunciar post Postado Agosto 19, 2009 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
eibon 2 Denunciar post Postado Agosto 19, 2009 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
Beraldo 864 Denunciar post Postado Agosto 19, 2009 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
João Batista Neto 448 Denunciar post Postado Agosto 19, 2009 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: Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 19, 2009 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
João Batista Neto 448 Denunciar post Postado Agosto 19, 2009 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
João Batista Neto 448 Denunciar post Postado Agosto 19, 2009 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: 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
eibon 2 Denunciar post Postado Agosto 20, 2009 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