CString to BYTE !?
-
Hi,
also ich hab ein CListCtrl, in dem in jeder Zelle ein halbes Byte eingetragen werden kann. Bei Klick auf OK werden Spalte 2 und 3 zusammengeführt und ergibt somit das komplette Byte.
Das steht nach GetItemText in meinem Temp.-String.So, nur wie bekomme ich jetzt Inhalt des Strings (= 1 Byte) in mein CByteArray ??
Hab einige Umwandlungen probiert, nur stimmt da immer nicht der Wert, der dann am Ende im Array steht !Kann mir da bitte jemand helfen ???
-
Was heisst zusammengeführt? Du hast dann 2 Strings die zu einem gemacht werden? Du hast dann also 2 Zeichen?
Wie werden die halb-Bytes eingegeben?
Hast du Unicode in den Projekteinstellungen aktiviert?
Dann arbeitet CString mit Unicode und du musst nach ASCII convertieren: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39492.html
-
Ich hole mir per GetItemText den Inhalt der aktuellen Spalte (es wird nur Spalte 2 und Spalte 3 aller Zeilen "behandelt") und über den operator += von CString hab ich dann nach dem "Behandeln" der 1. Zeile genau ein Byte, dass in dem String steht (da ja in Spalte 2 genau 4 Bits stehen und in Spalte 3 auch 4 Bits stehen).
Und genau diesen Inhalt will ich in mein CByteArray einfügen. Und das alles passiert in jeder Zeile, da ich ja nach jeder Zeile immer ein Byte im String stehen hab, das ich unbedingt in mein Array aufnehmen muss !
Und nein, habe kein Unicode, nur MBCS.
-
R3dNeXX schrieb:
Ich hole mir per GetItemText den Inhalt der aktuellen Spalte (es wird nur Spalte 2 und Spalte 3 aller Zeilen "behandelt") und über den operator += von CString hab ich dann nach dem "Behandeln" der 1. Zeile genau ein Byte, dass in dem String steht (da ja in Spalte 2 genau 4 Bits stehen und in Spalte 3 auch 4 Bits stehen).
Du hast dann doch 2 Zeichen im string stehen. In deinem Fall 2 Byte.
Die 2 Zeichen kannst du per bitshift und bitoder zu einem Byte zusammenführen.
z.B. (Pseudocode)CString str = cstringSpalte2 + cstringSpalte3; char upperHalfByte = str[0]; char lowerHalfByte = str[1]; char byte = ((upperHalfByte&0x0F)<<4) | (lowerHalfByte&0x0F);
Edit: wobei str natürlich überflüssig ist.
-
Hab dich im Grunde schon verstanden, nur müsste nicht hier:
ihoernchen schrieb:
char upperHalfByte = str[0]; char lowerHalfByte = str[1];
cstringSpalte2 und in der 2. Zeile cstringSpalte3 auf der rechten Seite stehen ?
Und da weiß ich ja nicht, wie man die Umwandlung durchführt !Jedes Zeichen in cstringSpalte2 ist ein Bit, in cstringSpalte3 genauso !
Komme mit dem Bit und Byte-Spaß noch nicht so richtig klar.
Sry, irgendwie raff ich heut gar nichts...
-
Es steht doch alles da? Oder irr ich mich?
-
Ich fang nochmal langsam an, ich glaub ich kapier noch irgendwas nicht ganz:
Spalte 2 --> 0010 und Spalte 3 -> 0110Nun steht nachm (z.B.) zweimaligem Ausführen von GetItemText in strCol2 "0010" und in strCol3 "0110" ! Jedes Zeichen in den Strings ist ein Bit.
Die beiden Strings werden aneinandergehängt und nun steht in strText "00100110". Genau dieser Inhalt soll in ein BYTE rein.Ich stör mich daran, hab aber keine Idee, wie ich das dort machn muss:
char upperHalfByte = str[0]; char lowerHalfByte = str[1];
Statt str[0] müsste doch dort strCol2 und statt str[1] müsste doch dort strCol3 stehen !??
Ich will ja den gesamten Inhalt der beiden Strings als Byte haben.Den Rest versteh ich schon !
-
Wenn du so eine Eingabe hast musst du jedes Zeichen in eine Zahl (0 oder 1) umwandeln. Durch bitshift und bitoder setzt du dann die einzelnen Bits im Byte.
Ungetestet / Pseudocode
char GetBit(TCHAR c) { return c=='0'? 0 : 1; } CString strCol2 = "0010"; CString strCol3 = "0110"; char bit3 = GetBit(strCol2[0])<<3; // oberstes char bit2 = GetBit(strCol2[1])<<2; char bit1 = GetBit(strCol2[2])<<1; char bit0 = GetBit(strCol2[3]); // <<0; // unterstes char upper = bit3 | bit2 | bit2 | bit0; // genauso mit strCol2 char byte = (upper<<4) | lower; // upper: bit 4-7, lower bit 0-3
-
Ok, ich glaube langsam macht es "klick" bei mir !
Ich werde es morgen probieren und nochmal Bescheid geben !Danke dir erstmal vielmals !!
-
So, also mal noch die fertige Variante:
CString strCol2 = m_list.GetItemText(i, 1); CString strCol3 = m_list.GetItemText(i, 2); char bit7 = GetBit(strCol2[0]) << 3; char bit6 = GetBit(strCol2[1]) << 2; char bit5 = GetBit(strCol2[2]) << 1; char bit4 = GetBit(strCol2[3]); char upper = bit7 | bit6 | bit5 | bit4; char bit3 = GetBit(strCol3[0]) << 3; char bit2 = GetBit(strCol3[1]) << 2; char bit1 = GetBit(strCol3[2]) << 1; char bit0 = GetBit(strCol3[3]); char lower = bit3 | bit2 | bit1 | bit0; char byte = (upper << 4) | lower; m_pInfoBytes->Add(byte); // CByteArray...
Funktioniert so perfekt !! Vielen vielen Dank für die Hilfe !!
Ich habs jetzt gerafft...