Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ansi String in Hex umwandeln

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.03.2006, 19:26 Uhr
~jpd511
Gast


hallo,

ich programmiere seit einiger zeit in c++, benutze zur zeit c builder 6.

ich will ein programm schreiben, in dem ich eine normal datei (also .exe, .txt, usw.) als TStringList einlese, und das ganze als hex code wiederausgebe.

ich hab bisher keine probleme, doch wie kann ich einen String, zB "T" in eine hexadezimale zahl umwandeln? als zwischenschritt bräuchte ich nur den ansi code von T, in hex is dann leicht. aber wie bekomm ich den ansi code von "T"???

bitte helft mir!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.03.2006, 20:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
char t = 'T';
printf("0x%0X", t);



gibt dir 0x54 aus (0x54 == 84 == 'T')
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.03.2006, 02:25 Uhr
Hans
Library Walker
(Operator)



Zitat von ~jpd511:
als zwischenschritt bräuchte ich nur den ansi code von T

Hi,

Du meinst sicherlich den ASCII-Code, oder?

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.03.2006, 07:35 Uhr
Tommix




Zitat von Hans:

Du meinst sicherlich den ASCII-Code, oder?
Hans

'Morgen,
das ist in dem Fall das gleiche. Der ASCII-Code umfaßt ursprünglich nur 127 Zeichen. Meistens meint man aber den von IBM auf 8 Bit erweiterten Zeichensatz, der z.B. in den Grafikkarten von PC einprogrammiert ist und dementsprechend üblicherweise auf der PC-Console (z.B. im Text-Modus) benutzt wird. Der ANSI-Zeichensatz, wie ihn z.B. Windows verwendet, stimmt bei den ersten 127 Zeichen mit dem ASCII-Zeichensatz überein, codiert aber z.B. Umlaute anders. Das führt dazu, das ein mit einem Windows-Editor programmiertes

C++:
MessageBox(NULL, "Hällo Wörld!", "Gruß", MB_OK);


geht, wogegen

C++:
printf("Hällo Wörld!\n");


Mist ausgibt. Ich find's ziehmlich bescheuert auf einem System zwei verschiedene Codes zu verwenden aber vermutlich wollte MicSoft unbedingt mal in einem Punkt ANSI-konform sein.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.03.2006, 00:39 Uhr
Hans
Library Walker
(Operator)


'namd,

ach da liegt der Hund begraben. Und dieser von ANSI erweiterte Code ist vermutlich wieder etwas anderes als Unicode, oder?
Was das Beispiel mit den Umlauten angeht, so ist mir das Phänomen auch schon häufiger mal begegnet. Ich hab nur bisher auch noch keine (Zeichen-) Codetabelle gefunden, die mich darüber aufklären würde, welches Zeichen mit welchem Code versehen ist. (Hab allerdings auch noch nicht ernsthaft danach gesucht, weil mich das Problem bisher nicht wirklich belastet hat... )

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.03.2006, 07:19 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Unicode heißt multibyte-charset (also z.b 2 Bytes pro buchstaben, gibt aber auch mehr vgl www.unicode.org) Ansonsten ist ASCII das gegenstück zu unicode, also singlebyte-charset. Darin gibt es grob 2 charset-tables, erstensmal das "ANSI-Charset", also das was Windows benutzt und das sog. OEM-Charset (was windows z.b in der dosbox benutzt). Der Unterschied beider ist eigentlich nur ab 128 zu sehen, also mit den sonderzeichen.

hab hier z.b eine Funktion zum konvertieren:


PHP 4:
function oem2ansi($string)
{
  $ansi2oem_tab = array(
  /*0000:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0010:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0020:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0030:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0040:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0050:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0060:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0070:*/ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  /*0080:*/ 0x00,0x00,0x00,0x9F, 0x00,0x00,0x00,0xD8, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  /*0090:*/ 0x00,0x60,0x27,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  /*00A0:*/ 0xFF,0xAD,0x9B,0x9C, 0x0F,0x9D,0x7C,0x15, 0x22,0x63,0xA6,0xAE, 0xAA,0x2D,0x52,0x00,
  /*00B0:*/ 0xF8,0xF1,0xFD,0x33, 0x27,0xE6,0x14,0xFA, 0x2C,0x31,0xA7,0xAF, 0xAC,0xAB,0x00,0xA8,
  /*00C0:*/ 0x41,0x41,0x41,0x41, 0x8E,0x8F,0x92,0x80, 0x45,0x90,0x45,0x45, 0x49,0x49,0x49,0x49,
  /*00D0:*/ 0x44,0xA5,0x4F,0x4F, 0x4F,0x4F,0x99,0x78, 0x4F,0x55,0x55,0x55, 0x9A,0x59,0x00,0xE1,
  /*00E0:*/ 0x85,0xA0,0x83,0x61, 0x84,0x86,0x91,0x87, 0x8A,0x82,0x88,0x89, 0x8D,0xA1,0x8C,0x8B,
  /*00F0:*/ 0x64,0xA4,0x95,0xA2, 0x93,0x6F,0x94,0xF6, 0x6F,0x97,0xA3,0x96, 0x81,0x79,0x00,0x98,
  );
  
  for($x = 0; $x < strlen($string); $x++)
  {
    if(ord($string[$x]) > 128)
    {
      foreach($ansi2oem_tab as $key => $value)
      {
        if(ord($string[$x]) == intval($value))
        {
          $string[$x] = chr($key);
          break;
        }
      }
    }
  }
  return $string;
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.03.2006, 08:26 Uhr
Tommix



Du postest PHP im ANSI-C Forum? Wenn das Pablo sieht...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.03.2006, 09:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hehe war nur als demonstration

hier die C(++)-Funktion dazu (andere Richtung):


C++:
void Ansi2Oem(char *string, unsigned int length)
{
  static unsigned char ansi2oem_tab[] =
  {
  /*0080:*/ 0x00,0x00,0x00,0x9F, 0x00,0x00,0x00,0xD8, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  /*0090:*/ 0x00,0x60,0x27,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  /*00A0:*/ 0xFF,0xAD,0x9B,0x9C, 0x0F,0x9D,0x7C,0x15, 0x22,0x63,0xA6,0xAE, 0xAA,0x2D,0x52,0x00,
  /*00B0:*/ 0xF8,0xF1,0xFD,0x33, 0x27,0xE6,0x14,0xFA, 0x2C,0x31,0xA7,0xAF, 0xAC,0xAB,0x00,0xA8,
  /*00C0:*/ 0x41,0x41,0x41,0x41, 0x8E,0x8F,0x92,0x80, 0x45,0x90,0x45,0x45, 0x49,0x49,0x49,0x49,
  /*00D0:*/ 0x44,0xA5,0x4F,0x4F, 0x4F,0x4F,0x99,0x78, 0x4F,0x55,0x55,0x55, 0x9A,0x59,0x00,0xE1,
  /*00E0:*/ 0x85,0xA0,0x83,0x61, 0x84,0x86,0x91,0x87, 0x8A,0x82,0x88,0x89, 0x8D,0xA1,0x8C,0x8B,
  /*00F0:*/ 0x64,0xA4,0x95,0xA2, 0x93,0x6F,0x94,0xF6, 0x6F,0x97,0xA3,0x96, 0x81,0x79,0x00,0x98,
  };

  for(unsigned int x = 0; x < length; x++)
  {
    if(string[x])
    {
      unsigned char C = (unsigned char)string[x];

      // ab char 128 nötig
      if(C > 128)
        string[x] = (signed char)ansi2oem_tab[C & 0x7F];
    }
  }
}


--
class God : public ChuckNorris { };

Dieser Post wurde am 09.03.2006 um 09:33 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: