Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » hex byte string zu charstring 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 ] [ 2 ] > 3 < [ 4 ]
020
16.01.2005, 13:08 Uhr
Hans
Library Walker
(Operator)


Hi,

das hier:

Code:
'int (unsigned char *,unsigned long)' : cannot convert parameter 2 from 'int [2]' to 'unsigned long'

bedeutet, das Du versuchst, einen Zeiger nach int zu konvertieren, also umzuwandeln. Und das geht nicht. Der Haken liegt hier:

C++:
int plr3[2] = {rpl[0],rpl[1]};
...
server->GameSendPacketToGame(rpl,plr3);


Da plr3 ein Zeiger ist, und kein unsigned long (bzw. DWORD), tritt da der Fehler auf.

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
021
16.01.2005, 14:37 Uhr
Diablo



gibt es keine möglichkeit einen zeiger zu nem unsigned long umzuwandeln??
ich will halt 2 in 1.
ich bekomm im spiel 2 bytes zu gesendet zb 0x37 und 0x38
das ist EINE zahl -> 78
und diese zahl will ich am ende im 2ten parameter als unsigned long stehen haben!

hättest du eine idee die zwei bytes in eine zahl anders umzuwandeln, dass dies vll klappen könnte?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
16.01.2005, 15:39 Uhr
Hans
Library Walker
(Operator)



Zitat von Diablo:
gibt es keine möglichkeit einen zeiger zu nem unsigned long umzuwandeln??


Nee, die gibt es nicht. Das wäre in etwa das selbe, als wenn Du aus einem Wegweiser den Ort machen wolltest, wo der Wegweiser hin führt.
Was Du aber umwandeln kannst, ist der Wert, auf den der Zeiger verweist.


Zitat:
ich bekomm im spiel 2 bytes zu gesendet zb 0x37 und 0x38
das ist EINE zahl -> 78
und diese zahl will ich am ende im 2ten parameter als unsigned long stehen haben!


Dann musst Du in einem Zwischenschritt aus den beiden ASCII-codes einen unsigned long machen. Dazu nimmst Du entweder Standard-konvertierroutinen wie atoi, atol oder so was, oder baust Dir selber eine. Pablo hat gestern in einem anderen Thread noch eine Möglichkeit gezeigt (posting 005). Da geht es zwar um Postleitzahlen, aber das sind letztlich auch "nur" Zahlen, und die Methode um aus den ASCII-Codes eine Zahl zu machen ändert sich nicht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 16.01.2005 um 15:48 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
16.01.2005, 18:32 Uhr
Diablo



danke für deine hilfe, aber mir hilfts überhaupt nicht! ich check das ganze leider nicht!
aba ich hatte vorhin ne kleine idee...
wieso nicht einfach damit rechnen? und die quersumme rausziehn!

C++:
#include <iostream>
#include <iostream.h>
#include <windows.h>
int main()
{BYTE rpl[2] = {0x37,0x33};
unsigned long quersumme = rpl[0] + rpl[1];
cout<<quersumme<<endl;
    return 0;}



+ ist steht doch für quersumme? und ++ für addieren?
nur kommen da leider ganz komische zahlen raus
subtrahieren geht wunderbar!

ich denk mal, das ist die einfachste möglichkeit, sollte man nur wissen wie man die quersumme aus ascii zahlen macht

->am ende sollte dann hier die zahl 73 ausgegeben werden! (damit will ich sagen, dass die bytes erst umgerechnet werden sollen)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
16.01.2005, 18:45 Uhr
Oliver
S2-Pixelgeneral



Zitat:

+ ist steht doch für quersumme?



+ steht für Addieren, ++ ist der Inkremenent. Einen Operator für Quersummen gibt es nicht.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
16.01.2005, 18:54 Uhr
Diablo



hmmz.. mir is das nur beim vb programmieren aufgefallen, dass + die quersumme gerechnet hat!
gibts keine möglichkeit, zb mit der math.h die quersumme auszurechnen?
das andere is mir zu kompliziert! bin auf eure hilfe angewiesen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
16.01.2005, 19:28 Uhr
Oliver
S2-Pixelgeneral


Du willst von einem (Zahlen-)String die Quersumme ausrechnen?


C++:
rpl[0]-0x30 + rpl[1]-0x30;


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
16.01.2005, 20:08 Uhr
Diablo



jaa
komischer term! der addiert nur die zahlen
das ergebnis ist 10, wenn die bytes 37 und 33 sind!
es sollte aber 73 sein.
ich google mal nach quersumme in c++!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
16.01.2005, 23:47 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von Diablo:
jaa
komischer term! der addiert nur die zahlen
das ergebnis ist 10, wenn die bytes 37 und 33 sind!


das ist ja auch die Quersumme von 37 bzw. 73. Oder was verstehst Du unter einer Quersumme?

Was den oben genannten Tipp angeht, hier mal ein Demoprogramm, mit einer Funktion zur Zahlenumwandlung:

C++:
#include <iostream.h>
#include <stdio.h>
#include <ctype.h>

/* Funktionsprototyp */
unsigned uzahl(char *s, int l);

int main()
{
  char zahlstring[12];
  unsigned zahl;
  int i;

  cout << "Bitte eine Zahl eingeben: ";
  cin >> zahlstring;
  i=0;
  while (i<12)    // Hier wird die Anzahl der Ziffern in zahlstring festgestellt
    { if (isdigit(zahlstring[i]))
         i++;
      else
         break;
    }
  cout << "Hexdarstellung der Eingabe: ";
  for (int t=0; t<i; t++)
      printf ("%02x ", zahlstring[t]); // Da ich gerade keine Ahnug hab, wie man
  printf ("\n");              // das in C++ macht, nehm ich C-Variante...
  zahl = uzahl(zahlstring, i);
  cout << "Ergebnis: " << zahl;
  
  return 0;
}

unsigned uzahl(char *s, int l)
{
  unsigned z=0;
  int i;
  int basis=10;
  for (i=0; i<l; i++)
    {
       if (!isdigit(s[i]))
          return 0;
       z = basis * z + (s[i]-'0');
    }
  return z;
} /* uzahl */




Die Sache funktioniert so: Man setzt eine Variable z auf 0 (Zahlwert Null), und baut in dieser Variablen anschliessend die Zahl zusammen, die durch die ASCII-Codes repräsentiert werden. Dazu wird von den ASCII-Codes wird jeweils 0x30 abgezogen, der auch der ASCII-Code der Ziffer Null ist. Dann multipliziert man die Zahl z mit 10 (Basis) und addiert den Wert, den man aus dem ASCII-code erhalten hat dazu. Dem ganzen liegt die Überlegung zugrunde, das man eine Zahl 53281 auch so darstellen kann:

Code:
12345 = 5*10^4 + 3*10^3 + 2*10^2 + 8*10^1 + 1*10^0


Wichtig: 10^x bedeutet hier 10 hoch x, aber nicht 10 XOR x.

Wenn Du jetzt nur "Bahnhof" verstanden hast, ist das nicht weiter tragisch: Die Art der Zahlendarstellung kannst Du auch in Informatikbüchern nachlesen. Warum die Funktion zur Zahlenumwandlung so funktioniert, wie sie es tut, steht auch hier im Forum irgendwo noch ausführlicher beschrieben, wenn ich mich nicht irre.

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
029
17.01.2005, 13:14 Uhr
Diablo



gudn mittag!
vielen dank für deinen code hans, bin grad dabei es umzuschreiben, sodass ich hex zahlen in die normale ausgabe umwandeln kann!

zu der quersumme... ohje ohje, da sieht man mal wieder, wie ich im matheunterricht aufpasse
mir ist gerade klar geworden, dass die quersumme von zb 15= 6 ist!
also 1+5.
ich wollte das ganze umgekehrt machen! praktisch aus den hex zahlen 0x31 und 0x35(1+5) einfach eine 15 machen! und diese zahl 15 soll nicht in einem zeiger sondern in unsigned long gespeichert werden

[edit]

C++:
#include <iostream.h>
#include <stdio.h>
#include <ctype.h>

/* Funktionsprototyp */
unsigned uzahl(char *s, int l);

int main()
{
char zahlstring[2] = {0x32,0x34};
  unsigned zahl;
  int i;
  i=0;
  while (i<12)
    { if (isdigit(zahlstring[i]))
         i++;
      else
         break;
    }
  for (int t=0; t<i; t++)
  zahl = uzahl(zahlstring, i);
cout << "Ergebnis: " << zahl <<endl; //es gibt 24 aus, und das sollte es auch :D,juhu
  
  return 0;
}

unsigned uzahl(char *s, int l)
{
  unsigned z=0;
  int i;
  int basis=10;
  for (i=0; i<l; i++)
    {
       if (!isdigit(s[i]))
          return 0;
       z = basis * z + (s[i]-'0');
    }
  return z;
}



nochmals danke für den code! so hab ich das jetzt umgeschrieben und es geht!

Dieser Post wurde am 17.01.2005 um 13:36 Uhr von Diablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ C / C++ (WinAPI, Konsole) ]  


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: