Avatar billede perande Nybegynder
10. november 2002 - 23:34 Der er 4 kommentarer og
1 løsning

Konvertering af en char string til hexadecimal værdi??

Hej... håber I kan hjælpe mig.. måske er der en simpel løsning på mit problem. Jeg skal indlæse en fil og derefter konvertere char til deres tilhørende værdi hexadecimalt??

Findes der en standart funktion til dette? f.eks. Hex, hvis ja.. i hvilket bibliotek findes den og hvad skal funktionen have som argument?

Håber der er løsning
Avatar billede dilleberg Nybegynder
10. november 2002 - 23:41 #1
En simpel løsning:

void HexDump(const char * szPath)
{
  FILE * pFile = fopen(szPath,"rb");
  if (pFile != NULL)
  {
    int iByte;
    while ((iByte = fgetc(pFile)) != EOF)
      printf(" %02x",iByte);
    fclose(pFile);
  }
  return;
}
Avatar billede perande Nybegynder
11. november 2002 - 17:03 #2
ok... lækkert.. selvom HexDump ikke står beskrevet i min bog.. surt. Hvilket bibliotek ligger den i? Jeg bruger Dev-C++ som komplier, hvis jeg indsætter løsningen (direkte) får jeg følgende fejl : 
"[Linker error] undefined reference to `WinMain@16'"

Indrømmet.. jeg er helt nu i C...
Avatar billede dilleberg Nybegynder
11. november 2002 - 20:17 #3
Det ser ud til at du forsøger at kompilere en Windows applikation, men mangler at angive, hvor kompileren skal søge efter libraries. Jeg anvender ikke Dev-C++, så jeg ved ikke hvordan opsætningen skal være.

HexDump fungerer kun i en konsol applikation pga. printf.
Eksempel:

#include <stdio.h>
// Indsæt HexDump her ...
int main(int argc, char * argv[])
{
  if (argc > 1)
    HexDump(argv[1]);
  return 0;
}

Her er en konverteringsfunktion, der fungerer uden at anvende std library:

void ByteAsHex(int iByte, char * szHex)
{
  for (int iIndex = 0; iIndex < 2; iIndex++, iByte >>= 4)
    szHex[1-iIndex] = "0123456789abcdef"[iByte & 0x0f];
  return;
}

Indholdet af for-løkken ser måske lidt underlig ud, men tekststrengen med hex-tegnene kan betragtes som et array af char's så derfor er indeksering OK.
Avatar billede perande Nybegynder
12. november 2002 - 14:13 #4
Hej "dilleberg".. nu ligger landet sådan, dette er en hovedbestand del i en opgave som jeg skal aflevere snart. umiddelbart kan jeg ikke få opgaven til at hænge ordenligt sammen, desuden kan jeg heller ikke nå at lære C med så lidt tid mellem hænderne.. Kunne du evt. have lyst til at lave opgave?

Opgave teksten lyder :

Opgaven går ud:

1.      At skrive et program HEXADUMP i C, der kører under DOS og indlæser en vilkårlig fil (dvs. alle filtyper) og udskriver de enkelte bytes dels som hexadecimale tal i venstre side af skærmen og dels som text-ækvivalent i højre side af skærmen.

o      Tip: Læs 16 byte af gangen (NB! Der kunne være fordele ved at bruge typen 'signed char') og skriv så disse ud igen til skærmen, dels som hexadecimale tal og dels som text-ekvivalenter.

o      NB! Husk at der kun skal skrives max. 24 linjer ud af gangen (så du har en skærmfuld) - og der må også gerne lige være et mellemrum mellem den hexadecimale del og text-delen af skærmen)

Programmet skal kunne indlæse en fil, hvor input filnavnet indlæses som parameter (både fra kommando-linje eller fra programmet).
Kommando-linjen
HEXADUMP ? eller HEXADUMP HELP/help

Skal på skærmen fremkalde en hjælpetekst, der beskriver programmets funktion.

Programmet skal spørge, om der skal udskrives en fil i ASCII-format, hvis navn indlæses under program-kørslen.
Eksistensen af både input og output-filer kontrolleres, og passende fejludskrifter/meddelelser skrives på skærmen
6.      Desuden skal programmet lave et "Fingerprint" af filen, dvs. For hver 1024 bytes i filen skal følgende ske:

o      Alle de 1024 bytes er blevet adderet.

o      Værdien af denne adderede værdi modulo 16 skrives ud til en ny fil. Et tal modulo 16 vil sige, at tallet divideres med 16 og divisionsresten er resultatet.

o      Resultatet skrives som en sekvens af hexadecimale værdier, og altså en fro hver 1024 byte

Også eksistensen af denne output-fil kontrolleres, og passende fejludskrifter/meddelelser skrives på skærmen


Det jeg har fået lavet indtil videre er :

#include <stdio.h>
#define NULL 0

main (int argc, char *argv[])

{

      FILE *fpt1;            /*input fil*/
      FILE *fpt2;            /*output fil*/

      signed char felt;
      int tabel [16];        /*heri lægges 16 indlæste bytes - skal vel være char */
      int i;                    /*index*/
      int j;                    /*index*/
      int count;              /*tæller*/
      int mod16;            /*heri lægges resultat af beregning*/
      long int sum;        /*sum af 1024 bytes*/


      if ((fpt1 = fopen (argv[1],"rb")) == NULL)      /*input fil åbnes*/
          printf ("\nFejl - kan ikke finde filen\n");
      if ((fpt2 = fopen (argv[1],"w")) == NULL)      /*output fil åbnes*/
          printf ("\nFejl - kan ikke finde filen\n");

      count = 0;
      sum = 0;
      mod16 = 0;
  do
    while
          for (j=1; j<=24;j++)                          /*der skal udskrives 24 linier*/
          {
              for (i=0; i<=15;i++)                        /*der skal indlæses 16 bytes*/     
                {
                    felt = getc (fpt1);                   
                    tabel[i]=felt;              /*her skal der måske være "end of file"*/
                    sum = sum + tabel[i];
                    count = count+1;
                    if (count = 1024)
                      {
                          mod16 = sum % 16;      /*beregn modulo 16*/
                       
                          //putc()Hvordan skriver man på fil ??      /*skriv mod16 på output fil*/
                       
                          count = 0;                    /*count nulstilles*/
                      }
                }

            printf ("%2X", tabel);                  /* her skrives den hexadecimalt*/
            printf (" ");                        /*her skrives en blank*/
            printf ("%16c", tabel);        /*her skrives 16 indlæste bytes*/ 

        }
      fclose (fpt1);
      fclose (fpt2);
}


send en mail til mig på perande@hotmail.com...
Avatar billede dilleberg Nybegynder
12. november 2002 - 22:13 #5
perande>> YHM
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester