Jump to content


Photo

Compressão E Descompressão De Arquivo


  • Faça o login para participar
14 replies to this topic

#1 trizzo

trizzo

    Turista

  • Usuários
  • 33 posts
  • Sexo:Não informado

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.

#2 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

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 (y)

#3 trizzo

trizzo

    Turista

  • Usuários
  • 33 posts
  • Sexo:Não informado

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

$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 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

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 trizzo

trizzo

    Turista

  • Usuários
  • 33 posts
  • Sexo:Não informado

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

#6 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 24/09/2008, 14:38

Entendi... :ponder:
é 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 trizzo

trizzo

    Turista

  • Usuários
  • 33 posts
  • Sexo:Não informado

Posted 24/09/2008, 14:46

beleza boirock, mto obrigado por ter ajudado.

#8 trizzo

trizzo

    Turista

  • Usuários
  • 33 posts
  • Sexo:Não informado

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.

$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?

#9 lwirkk

lwirkk

    Veterano

  • Usuários
  • 1314 posts
  • Sexo:Não informado

Posted 26/09/2008, 16:07

Usando $frase{0}
você obteria o primeiro caracter. e assim por diante. (y)
Posted Image
"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! =)

#10 trizzo

trizzo

    Turista

  • Usuários
  • 33 posts
  • Sexo:Não informado

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?

#11 lwirkk

lwirkk

    Veterano

  • Usuários
  • 1314 posts
  • Sexo:Não informado

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 =)
Posted Image
"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! =)

#12 Falci

Falci

    12 Horas

  • Usuários
  • 187 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 26/09/2008, 17:54

Bem.. pensando na parte de descompactar..

AAB = 2A 1B
AA B = 2A 1B
Como saber se o "B" faz parte de "AA" ou se ele estava isolado ?
<?php /* falci at Falci.me */

$naoAcrediroQueEuFizUmaVariavelTaoGrandeSoParaGuardarUmTres = 3;
?>

#13 CMAC

CMAC

    Normal

  • Usuários
  • 93 posts
  • Sexo:Masculino

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 trizzo

trizzo

    Turista

  • Usuários
  • 33 posts
  • Sexo:Não informado

Posted 29/09/2008, 12:07

Obrigado CMAC!! Agora vou ver como faço para descompactar isso.

#15 lwirkk

lwirkk

    Veterano

  • Usuários
  • 1314 posts
  • Sexo:Não informado

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;

Posted Image
"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)

IPB Skin By Virteq