senden von character mit wert "255" nicht möglich?
-
hallo!
ich lese aus einem "ifstream" den ich selbst mit daten beschreibe:
(aus dem kernel heraus, aber das sollte egal sein)// kernel, könnte auch eine pipe sein, also "put_user" // könnte auch "send(..)" sein! char = 255; //oder char = 0xFF put_user(&char,1); //schicke einen "byte" rüber
im client:
char newByte; ifstream inStr("/dev/X",ios::in | ios::binary); inStr.read(&newByte,1);
wenn ich jetzt auf der client seite teste was ich empfange, dann bekomme ich meist auch das, was ich erwarte (0 < char < 255). jedoch nicht bei char=255. ein test:
if(newByte == 255)
schlägt immer fehl.ideen? mein test falsch? oder total verhauen?
danke für jeden tipp
marcel
-
char sind per default vorzeichenbehaftet, d.h. der Wert 255 wird als -1 gespeichert.
Um das Problem zu vermeiden, musst Duif ( ( newByte & 255 ) == 255 ) ...
schreiben.
-
hmm.
und wenn ich von vornherein eine unsigned char nehmen, dann müsste es doch gehen oder?
(unsigned char = 255;)
aber das ging bei mir auch nicht.
-
Prinzipiell muesste das schon gehen. Probier's doch mal mit dem "& 255".
EDIT: wichtig ist vor allem das Auslesen, nicht das Reinschreiben. Der Prozessor selbst kennt keine Datentypen, nur Wortlaengen. D.h. beim Auslesen aus einem "char" generiert der Compiler einen "MOVSX" o.ae. Befehl, der das Byte vorzeichenbehaftet zu einem "int" expandiert, wenn Du z.B. einen Vergleich mit einem Integer machst "255".
EDIT II: Du kannst Dir auch ein Macro a la:
#define IUC( c ) static_cast<int>( static_cast<unsigned char>( c ) )
machen, und dann z.B.
if ( IUC( newByte ) == 255 ) ...
schreiben. Oder, wie gesagt, mit "& 255".
-
Ich habs mit einem kleinen trick versucht, aber erfolglos:
char referenceValue = 255; //referenzwert! if(newByte == referenceValue)
hehe.
geht aber auch net. ich glaub langsam (!!) ich bin auf ne völlig falschen fährte.@Power Off: das mit den datentypen/registry entries ist mir bekannt. aber der effekt lässt sich leider trotzdem nicht lösen.. danke erstmal!
ich mach wohl erstmal ne pause mit dem thema-- man verguckt sich da zu schnell drin.
marcel
-
Wieso machst du nicht das, was dir geraten wird? Und mit 254 geht's wirklich? Kann ich mir kaum vorstellen...
-
Also nach test:
das senden schlägt fehl!wenn ich einfach
put_user(0xFF,1);
mache, dann geht alles korrekt.allerdings mit:
(unsigned) char test = 0xFF; //beide varianten (signed/unsigned) gleicher effekt
put_user(test,1);
geht es nicht, ergebnis ist immer "8" (int)(ich kann reinschreiben was ich will).ABER!
mit einem puffer aus unsigned shorts klappt die übertragung problemlos.????? was ist da los ????
-
Was machst du da überhaupt? Das zweite Argument zu put_user ist eine Adresse. Wie kann 1 eine gültige Adresse sein?
EDIT: Und wenn ich mir anschaue, was put_user überhaupt macht, beschleicht mich der Verdacht, dass dein put_user(0xFF, 1) einen int (4 Bytes) in den user space schreibt und nicht nur 1 Byte, wie du es wahrscheinlich haben willst. Und zwar deshalb, weil das Literal 0xFF ein int-Literal ist. Für ein char-Literal müsstes du '\xff' machen. Aber nachdem es mit int funktioniert und mit char nicht, dürfte da eh irgendwas gröberes kaputt sein. Hast du big endian oder little endian?