concatenação [RESOLVIDO]

1. concatenação [RESOLVIDO]

Willian
ThePinkSharK

(usa Slackware)

Enviado em 11/12/2011 - 22:41h

É o seguinte, me deparei com um problema horrivelmente horripilante que está me tirando o sono, e o fato de eu ser [*****] o suficiente para não conseguir resolver um problema aparentemente simples como esse está me deixando pior ainda.

Quero ler um arquivo com dados hexadecimais e colocar 4 bytes dentro de um int com a representação numérica dele em decimais.

Ex:
no arquivo tenho:

10 00 00 00 (que olhando eu sei que é 16 em decimal usando little endian)

e quero ler esses 4 bytes em C e retornar um int com o valor 16.

Minha dúvida é: como eu faço isso?


  


2. Solução em C++

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 11/12/2011 - 23:55h

Boa noite Willian,

Segue uma solução em C++ deixando a performance de lado:


#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <cstdlib>

int main ( int argc, char *argv[] )
{
std::string text_value;
std::cin >> text_value;
std::reverse( text_value.begin(), text_value.end() ); // Little Endian is not great ;-)
std::stringstream converter( text_value );

int value;
converter >> std::hex >> value;
std::cout << "0x" << text_value << " --> " << value << std::endl;

return EXIT_SUCCESS;
}


Em C também deve ser simples, já tentou usar as opções de formatação do sprintf()? O importante é notar que tudo isso não passa de uma representação em texto suportada pela linguagem.

Abraço!

P.S.: 10 00 00 00 é igual a 1 em qualquer sistema numérico.


3. Re: concatenação [RESOLVIDO]

Willian
ThePinkSharK

(usa Slackware)

Enviado em 12/12/2011 - 00:18h

Meu conhecimento em realçao a C++ é uma miséria, cresci no meio de assembly, C e Fortran77. A parte de inverter os bites eu posso fazer com um loop qualquer. Agora quanto ao fscanf(),eu tentei algumas coisas mas acho que não estou utilizando o filtro certo.

PS: o 10 00 00 00 foi so um exemplo nem pensei direito quando escrevi ele.


#include <stdio.h>

int main()
{
FILE *arquivo = fopen("batata.uva","rb");
int c;

fseek(arquivo,23,SEEK_SET);
fscanf(arquivo"%X",c);
printf("%d",c);

fclose(arquivo);
return 0;
}


Tentei coisas do gênero, mas não seiq ue filtro usar li o man do fscanf, mas pelo visto sou burro de mais.


4. Re: concatenação [RESOLVIDO]

Willian
ThePinkSharK

(usa Slackware)

Enviado em 12/12/2011 - 10:24h

sobe


5. Solução em C

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 12/12/2011 - 14:13h

Oi Willian,

Segue a solução em C, a mágica está na, difícil de encontrar, sscanf():


#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

int main( int argc, char *argv[] )
{
FILE *pFile = fopen("hex.txt","r");
char buffer[11]; // ddddddddx0
int n;

fscanf(pFile,"%s",buffer);
buffer[8] = 'x'; buffer[9] = '0'; buffer[10] = '?'; // append x0
std::reverse( buffer, buffer+10 );
sscanf(buffer,"%X",&n); // here is the magic ;-)

printf("%s in decimal is %d\n",buffer,n);

fclose(pFile);
return EXIT_SUCCESS;
}


Como usei o std::reverse(), você terá que compilar o exemplo com o g++ ao invés do gcc. ;-)

No lugar de '?', deveria ser o caractere nulo (backslash 0).

Abraço!


6. Conseguiu resolver?

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 14/12/2011 - 09:28h

Oi Willian,

Algum progresso?


7. Re: concatenação [RESOLVIDO]

Willian
ThePinkSharK

(usa Slackware)

Enviado em 18/12/2011 - 18:24h

é me virei a força utilizando o fread e relendo funções, realmente não se encontra nada disos na internet a fora sem palavras chaves bem focadas, coisa que eu infelizmente não tive a sorte de encontrar.

Bem minha solução foi a seguinte:


/*código fonte retirado de www.vivaolinux.com.br
escrito por ThePinkShark*/

#include <stdio.h>

int main()
{
FILE *vivaolinux=fopen("vivaolinux.tux","rb");
int inteiro=0;

fseek(23,arquivo);
fread(&inteiro,4,1,arquivo); //Nota 1
printf("%d",inteiro);
return 0;
}



1 - É ai que a mágica acontece, a função fread vai jogar o que ele ler dentro do inteiro, o segundo arqumento define que a fução vai pegar 4 bytes e o terceiro argumento define quantas vezes ela vai pegar esses 4 bytes e o ultimo argumento define de onde ela irá pegar os bytes.

detalhe importante pelo que vi a função fread no GCC detecta o endian do arquivo "automagicamente".


8. O arquivo é binário?

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 18/12/2011 - 19:34h

Então o arquivo é binário? Estava pensando em uma representação textual "10000000". ¬¬

Abraço!


9. Re: concatenação [RESOLVIDO]

Willian
ThePinkSharK

(usa Slackware)

Enviado em 18/12/2011 - 19:58h

Não não, foi somente para exemplificar o negócio mesmo. Um arquivo de texto também binário. A ideia era pegar os dados do header do arquivo. Quanto a concatenar, não tem como fazer sem usar matemática hahahaha.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts