Pointer zu Array Konvertierung ... oder byteweises zugreifen auf Inhalt von Pointer
-
Hi,
ich hab ein Problem.
Ich habe folgendes:void cClient::Send (void * data, Uint32 len){
unsigned int CurrentKey0 = 0xc0a8b202;
for (int i=0; i < len; i++)
{
data[i] = (void)(((CurrentKey0) ^ (byte)data[i]));
}
int result = len;
result = SDLNet_TCP_Send(socket, data, len);
}Ich möchte byteweise auf den Inhalt von data zugreifen und ihn verändern.
Leider kommt immer der gleiche Fehler:
"349 G:\src\net\Client.cpp pointer of typevoid *' used in arithmetic" "349 G:\\src\\net\\Client.cpp
void*' is not a pointer-to-object type"Wie kann ich data byteweise nach Schema "CurrentKey0 ^ data[i]" verändern und das Ergebnis wieder in data speichern?
vielen vieln Danke...fLO^SiENcE
-
Hi!
Problem ist das es keine void-Objekte gibt, somit kannst du auch nicht nach void casten. Es gibt nur Zeiger auf void. Du kannst auf void-Zeiger nicht indiziert zugreifen und auch nicht dereferenzieren.
Ich denke dir dürfte ein Vector behilflich sein vom Typ int oder so. Oder vielleicht bitset.
Code-Hacker
-
oder du benutzt ein Template.
Übrigens ist size_t der richtige Typ für größen Angaben und nicht Uin32 oder int, vorallem nicht gemischt.
btw. sfds
-
Ich hab leider zu wenig Ahnung von Pointern und C++ als das ich verstehe was Du meinst.
Bin java Prog. und da hab ich solche Probleme nie gehabt...
Was tu ich nun...praktisch?
Nochmal der Code:
void cClient::Send (void * data, size_t len){ unsigned int CurrentKey0 = 0xc0a8b202; for (int i=0; i < len; i++) { data[i] = (byte)(((CurrentKey0) ^ (byte)data[i])); } size_t result = len; result = SDLNet_TCP_Send(socket, data, len); }
-
Hi,
hab den Code mal umgeschrieben...aber es is trotzdem ein Fehler beim Compilieren.
void cClient::Send (cPacket * packet) { if ((socket < 0) || (!packet)) return; size_t len=packet->len(); for (int i=0; i < len; i++) { packet[i] = (byte)(((CurrentKey0) ^ (byte)packet[i])); } Send(&packet->packet, packet->len()); }
Fehlermeldung:
364 G:\src\net\Client.cpp `class cPacket' used where a `byte' was expectedcPacket sieht so aus:
cPacket::cPacket() { if (!table_initialised) { table_initialised = true; InitTables(); } Reset(); memset(&packet, 0, sizeof packet); }
Irgendjemand ne Idee?
-
Überlad einfach den Indexoperator, der nen char& aus deiner Nachricht
zurückgibt und du kannst auch ähnlichen Code wie vorher schon benutzen.Sieht mir ja etwas nach codieren aus, da würd ich das in ne eigene Methode
packen, da codieren und decodieren mit xor das selbe ist.
-
template<typename T> void Client::Send(T *data, std::size_t len) { /*unsigned int*/ T CurrentKey0 = 0xc0a8b202; for (std::size_t i=0; i < len; i++) data[i] ^= CurrentKey0; std::size_t result = SDLNet_TCP_Send(socket, data, len); }
-
Kingruedi's Code wäre auch mein Vorschlag, sofern der Typ von data variabel sein kann. Ist der Parameter der Send für data übergeben wird vom Typ void* funktioniert das trotzdem nicht. Dann hilft nur ein Cast.
byte* p = reinterpret_cast<byte*>(data);
Mit p[...] kannst du dann die einzelnen Elemente ansprechen. Dennoch sei nochmal darauf hingewiesen, dass Casts mit Vorsicht zu geniessen sind, da sie nicht ganz unproblematisch sind.