
Compressão E Descompressão De Arquivo
Started By trizzo, 24/09/2008, 10:14
14 replies to this topic
#1
Posted 24/09/2008, 10:14
Bom dia Pessoal,
Preciso fazer um programa que faça a compressão e descompressão de arquivos.
Exemplo: se tenho um arquivo escrito AAA BBB AA CCC preciso comprimí-lo em 3A 3B 2A 3C, o número de vezes que aparece as letras e depois fazer o processo inverso.
Alguém poderia me dar uma dica do que devo usar e como começar, por favor?
Muito Obrigado.
Preciso fazer um programa que faça a compressão e descompressão de arquivos.
Exemplo: se tenho um arquivo escrito AAA BBB AA CCC preciso comprimí-lo em 3A 3B 2A 3C, o número de vezes que aparece as letras e depois fazer o processo inverso.
Alguém poderia me dar uma dica do que devo usar e como começar, por favor?
Muito Obrigado.
#2
Posted 24/09/2008, 11:14
1:: Use explode() e separe a string pelo caractere espaço
2:: Use str_repeat() para repetir a substring do segundo caractere pelo resultado do substring do primeiro caractere
3:: Para navegar dentro do array gerado por explode(), use foreach
Para o processo inverso você vai usar o explode da mesma forma e o count_chars() para contar as letras.
Boa sorte
2:: Use str_repeat() para repetir a substring do segundo caractere pelo resultado do substring do primeiro caractere
3:: Para navegar dentro do array gerado por explode(), use foreach
Para o processo inverso você vai usar o explode da mesma forma e o count_chars() para contar as letras.
Boa sorte

#3
Posted 24/09/2008, 13:04
boirock, obrigado por responder.
A primeira parte eu entendi, mais ou menos seria assim?
1:: Use explode() e separe a string pelo caractere espaço
A segunda parte não entendi muito bem, você poderia me passar um exemplo, por favor?
2:: Use str_repeat() para repetir a substring do segundo caractere pelo resultado do substring do primeiro caractere
eu fiz o for each:
Ta me retornando
3: " " , 4: "A" , 4: "B" , 3: "C" , 3: "D".
Como faço pra retornar na ordem?
3A 3B 3C 1A 3D 1B
A primeira parte eu entendi, mais ou menos seria assim?
1:: Use explode() e separe a string pelo caractere espaço
$str = "AAA BBB CCCA DDDB"; $pedacos = explode("|",$str);
A segunda parte não entendi muito bem, você poderia me passar um exemplo, por favor?
2:: Use str_repeat() para repetir a substring do segundo caractere pelo resultado do substring do primeiro caractere
eu fiz o for each:
foreach (count_chars($str, 1) as $i => $val) { echo "$val: \"" , chr($i) , "\" , \n"; }
Ta me retornando
3: " " , 4: "A" , 4: "B" , 3: "C" , 3: "D".
Como faço pra retornar na ordem?
3A 3B 3C 1A 3D 1B
#4
Posted 24/09/2008, 14:24
Cara, tentei fazer aqui... veja se ajuda (usei strlen()):
$retorno = null; $teste = "AAA BBB CCC DDD"; $testeArr = explode(" ",$teste); foreach ($testeArr as $grupo) { $retorno.= ($retorno?" ":null); $retorno.= $grupo[1]; $retorno.= strlen($grupo); } echo $retorno;
#5
Posted 24/09/2008, 14:29
então isso imprimiu:
A3 B3 C4 D3
eu precisaria de assim, acho que você entendeu... "AAA BBB CCCA DDD";
3A 3B 3C 1A 3D
A3 B3 C4 D3
eu precisaria de assim, acho que você entendeu... "AAA BBB CCCA DDD";
3A 3B 3C 1A 3D
#6
Posted 24/09/2008, 14:38
Entendi... 
é cara, não conheço nenhuma função que te ajude. =/
Acho que você vai ter que fazer byte a byte e comparar com a posição anterior...

é cara, não conheço nenhuma função que te ajude. =/
Acho que você vai ter que fazer byte a byte e comparar com a posição anterior...
#7
Posted 24/09/2008, 14:46
beleza boirock, mto obrigado por ter ajudado.
#8
Posted 26/09/2008, 15:40
Estou tentando fazer esse programa contando byte a byte.
Comecei com um for para contar as letras que são iguais.
Entretanto acho que essa comparação está incorreta para comparar string, como faço para comparar string no PHP?
Comecei com um for para contar as letras que são iguais.
$frase = "AA BB CC DD"; for ($i=0;$i<=strlen($frase);$i++){ if ($frase[$i]==$frase[$i++]){ $conta=$conta+1; }
Entretanto acho que essa comparação está incorreta para comparar string, como faço para comparar string no PHP?
#10
Posted 26/09/2008, 16:29
certo lwirkk... a lógica que estou tentando implementar é a seguinte:
Se o primeiro caracter é igual o segundo caracter então conta recebe +1 senão comece a contar o próximo caracter diferente.
Por exemplo se tenho $frase = "AA BB CC DD AAB CA";
Quero fazer o resultado ficar assim: 2A 2B 2C 2D 2A 1B 1C 1A.
Você poderia me ajudar, por favor?
Se o primeiro caracter é igual o segundo caracter então conta recebe +1 senão comece a contar o próximo caracter diferente.
Por exemplo se tenho $frase = "AA BB CC DD AAB CA";
Quero fazer o resultado ficar assim: 2A 2B 2C 2D 2A 1B 1C 1A.
Você poderia me ajudar, por favor?
#11
Posted 26/09/2008, 16:46
Eu já fiz uma lógica parecida aqui a um tempo atrás, dá para fazer tranquilo como Boirock disse, mas fica algo meio feio o código


"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!

#13
Posted 26/09/2008, 18:09
Faz uns dias que não programo nada então resolvi tentar fazer isso. Claro que não é a melhor solução, pois executa dois ciclos. Foi mesmo só para ver se conseguia fazer em uns minutos.
<? $frase = "AA BB CC DD AAB CAA"; $resultado = array(); $resultado[0]['letra'] = $frase[0]; $resultado[0]['total'] = 1; $j = 0; for($i = 1; $i < strlen($frase); ++$i) { if($frase[$i] === $frase[$i - 1]) { $resultado[$j]['total']++; } else { $j++; $resultado[$j]['letra'] = $frase[$i]; $resultado[$j]['total'] = 1; } } $frase_codificada = ''; foreach($resultado as $dado) { if($dado['letra'] === ' ') { $frase_codificada .= ' '; } else { $frase_codificada .= $dado['total'] . $dado['letra']; } } echo $frase_codificada;
#14
Posted 29/09/2008, 12:07
Obrigado CMAC!! Agora vou ver como faço para descompactar isso.
#15
Posted 29/09/2008, 19:29
Dependendo de como está o resultado, poderia pegar e separar esses valores com explode e usar loop para ir adicionando o resto dos dados:
$result='2A 1B'; $result=explode($result); $count=count($result); for($=0;$i<$count;$i++){ for($y=0;$y<$result[$i]{0};$y++){ $str.=$result[$i]{1}; } $str.=' '; } echo $str;

"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!

1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)