Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 06:46

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



vector typeconvertierung char > struct

Discussion on vector typeconvertierung char > struct within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Crack-wtf's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 1,400
Received Thanks: 2,939
vector typeconvertierung char > struct

Hi Leute,

ich habe aktuell ein kleines "Problem".
Zwar habe ich schon einen Workaround, würde aber trotzdem gerne wissen ob/wie es trotzdem geht.

Ich habe einen vecor vom typ char.
Dieser enthält byte für byte eine bestimmte Datei.

Jetzt möchte ich daraus einen vectoren machen, der eine struct als typ hat.

Folgendes habe ich probiert:

Code:
struct PakBody
{
	unsigned char fileIndex;
	char filePath[132];
	int fileSize;
	int fileOffset;
};


std::vector<unsigned char> m_pakContent;
std::vector<PakBody> m_pakBodys(m_pakContent.begin(), m_pakContent.end());
Der Compiler beschwert sich mit folgendem Fehler

Code:
Error	1	error C2664: 'PakBody::PakBody(const PakBody &)' : cannot convert argument 1 from 'unsigned char' to 'const PakBody &'
Was mache ich falsch?

Ps: Mein "Workaround" ist ein resize von m_pakBodys + memcpy.
Crack-wtf is offline  
Old 05/02/2015, 09:27   #2


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Du könntest für den Zugriff casten. Sähe dann so aus:
Code:
DoSomethingWith(reinterpret_cast<PakBody*>(&m_pakContent[0])[someIndex]);
Vorteil ist natürlich, dass nicht kopiert und kein neuer Speicher angefordert werden muss. Nachteil ist, dass das schnell nervig und unübersichtlich wird.
Kannst du nicht auf den std::vector<unsigned char> verzichten und direkt nur den struct vector nutzen? Ich denke, dass das die beste Möglichkeit wäre.
Oder musst du unbedingt kopieren, weil du beide vectors seperat benötigst?
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
2 Users
Old 05/02/2015, 11:16   #3
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Les dich bitte in das Thema Vectoren ein.
Du könntest als erstes mal den Vector der die Struct enthãlt zu einen Vector machen der einfach nur Pointer beinhaltet. Das was du da vorhast ist schwachsinnig einen Vector eine Grundgröße zu geben, da Vectoren Dynamische Arrays sind.

Code:
struct PakBody
{
	unsigned char fileIndex;
	char filePath[132];
	int fileSize;
	int fileOffset;
};


std::vector<unsigned char> m_pakContent;
std::vector<PakBody*> m_pakBodys;

void AddShiat()
{
PakBody* pPakBody = new PakBody;
unsigned char pChar;
//hier beliebigen shiat in pPakBody setzen
//hier den char setzen
m_pakBodys.push_back(pPakBody);
m_pakContent.push_back(pChar);
}
Wundert euch net, gerade alles am Handy geschrieben.
Terrat is offline  
Old 05/02/2015, 11:22   #4
 
Crack-wtf's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 1,400
Received Thanks: 2,939
Ich brauch aber die Bytes beieinander, weil ich diese verschlüssle/entschlüssle. (mit DES)
Mit pointern wäre das ziemlich umständlich bis garnicht möglich, weil ich immer 8byte Blöcke brauche.

Den wechsel von char -> struct habe ich deswegen gemacht, weil ich ja in 8byte blöcken entschlüssle und nach jedem durchlauf eine struct noch nicht voll ist.

Was ist ver/entschlüssle ist eine liste von dateien.
Crack-wtf is offline  
Old 05/02/2015, 14:23   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Mit Pointern geht das eigentlich sehr gut. Ich würde von Anfang an die Daten in einen vector mit Structs einlesen und dann so zum Verschlüsseln vorgehen:

Code:
void Decrypt(char *buf, size_t bufsize);

Decrypt(reinterpret_cast<char *>(&vec[0]), vec.size());
vector ist eine generische Klasse. Die Dinger haben es so an sich, dass sie typsicher sind.
Code:
std::vector<PakBody> m_pakBodys(m_pakContent.begin(), m_pakContent.end());
Genau so eine Schweinerei wird dadurch verhindert. Du hast eine Liste von PakBodys und willst sie mit einer Liste von chars initialisieren. Dafür wird nun jedes Element von m_pakContent durchgegangen und in m_pakBodys gesteckt, was natürlich nicht klappt, da char nun mal nicht in PakBody konvertiert werden kann. Dein Workaround nutzt genau dieselbe Schweinerei, die mein Beispiel auch nutzt: durch Verwenden von Pointern und eines Casts umgeht man die Typprüfung und interpretiert die Daten, auf die gezeigt wird, neu. Du machst es halt per memcpy und erzeugst damit eine Kopie und ich würde es eher in-place machen.
MrSm!th is offline  
Thanks
2 Users
Old 05/02/2015, 15:38   #6
 
Crack-wtf's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 1,400
Received Thanks: 2,939
Quote:
Originally Posted by MrSm!th View Post
Mit Pointern geht das eigentlich sehr gut. Ich würde von Anfang an die Daten in einen vector mit Structs einlesen und dann so zum Verschlüsseln vorgehen:

Code:
void Decrypt(char *buf, size_t bufsize);

Decrypt(reinterpret_cast<char *>(&vec[0]), vec.size());
vector ist eine generische Klasse. Die Dinger haben es so an sich, dass sie typsicher sind.
Code:
std::vector<PakBody> m_pakBodys(m_pakContent.begin(), m_pakContent.end());
Genau so eine Schweinerei wird dadurch verhindert. Du hast eine Liste von PakBodys und willst sie mit einer Liste von chars initialisieren. Dafür wird nun jedes Element von m_pakContent durchgegangen und in m_pakBodys gesteckt, was natürlich nicht klappt, da char nun mal nicht in PakBody konvertiert werden kann. Dein Workaround nutzt genau dieselbe Schweinerei, die mein Beispiel auch nutzt: durch Verwenden von Pointern und eines Casts umgeht man die Typprüfung und interpretiert die Daten, auf die gezeigt wird, neu. Du machst es halt per memcpy und erzeugst damit eine Kopie und ich würde es eher in-place machen.
Aber wie soll ich byteweise auf den structvector schreiben?
Das geht doch nicht oO

Oder bin ich zu doof dafür?
Kann ja nicht einfach ein Byte zu der struct casten.
Crack-wtf is offline  
Old 05/03/2015, 10:47   #7
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Na klar kannst du das - Vektoren sind genau deswegen so nützlich, weil ihr Inhalt byteweise ~in einem Block~ im Speicher liegt.
Oder verwirrt dich &vec[0]?
Damit bekommst du einen Pointer auf das erste Byte aus genau diesem Speicherblock und kannst damit tun und lassen was du willst - wie bei einem normalen C-Array

Padmak
Padmak is offline  
Old 05/03/2015, 13:45   #8

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
Warum eigentlich nicht vec.data() verwenden?
snow is offline  
Old 05/05/2015, 16:16   #9
 
Crack-wtf's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 1,400
Received Thanks: 2,939
Dann muss ich doch aber immer manuell ein Resize machen.

Byte reservieren, byte schreiben, byte reservieren, byte schreiben.

Ich versuch aber mal was anderes.
Ich resize direkt meinen Structvector und loope per index durch &vec[i].
Ist zwar unsauber, aber wenns klappt o:

Mein Problem ist, wenn ich einen Vector mit dem typ "structxy" deklariere.
Dann kann ich ihm nicht sagen: "Schreibe folgendes BYTE."
Er würde ja nicht den index um 1 hochsetzen, sondern um die größe der struct.
Crack-wtf is offline  
Old 05/05/2015, 16:44   #10
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
Wie wäre es mit einer Union?
Code:
union Name {
  char chrArr[141]; //SizeOf(Record)
  YourRecord Rec; // Deine Struct
}
Der Vektorindex für die Chars ist dann ByteIndex Div SizeOf(Union) und der Char Array index ist dann ByteIndex Modulo SizeOf(Union). Und wenn du die Structs Brauchst ist es einfach Union.Rec.

Wenn es das ist was du meinst

PS: Warum nutzen so viele C Entwickler Chars statt Bytes? Ich versteh das einfach nicht
warfley is offline  
Old 05/06/2015, 15:34   #11


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by Crack-wtf View Post
Dann muss ich doch aber immer manuell ein Resize machen.

Byte reservieren, byte schreiben, byte reservieren, byte schreiben.
Warum nicht einfach ein einziges mal .resize(), so wie in deinem Workaround?
Außerdem kannst du die Bytes einfach in ein ganz normales char Array einlesen, den Pointer zu einem PakBody-Pointer casten und mit diesem dann den vector initialisieren (Konstruktor mit first und last als Parameter).

ca. so:

Code:
const int max_pakbody_count = 42;
char buf[max_pakbody_count * sizeof(PakBody)];

//read stuff...

PakBody *pakbodyView = reinterpret_cast<PakBody *>(buf);
vector<PakBody> contents(pakbodyView, pakbodyView + max_pakbody_count - 1);
Quote:
Ich versuch aber mal was anderes.
Ich resize direkt meinen Structvector und loope per index durch &vec[i].
Ist zwar unsauber, aber wenns klappt o:
Und dann?

Quote:
Mein Problem ist, wenn ich einen Vector mit dem typ "structxy" deklariere.
Dann kann ich ihm nicht sagen: "Schreibe folgendes BYTE."
Er würde ja nicht den index um 1 hochsetzen, sondern um die größe der struct.
Doch, kannst du. Mit Pointer-Schweinerei. Genau für sowas ist die gut.

Quote:
Originally Posted by warfley View Post
Wie wäre es mit einer Union?
Code:
union Name {
  char chrArr[141]; //SizeOf(Record)
  YourRecord Rec; // Deine Struct
}
Der Vektorindex für die Chars ist dann ByteIndex Div SizeOf(Union) und der Char Array index ist dann ByteIndex Modulo SizeOf(Union). Und wenn du die Structs Brauchst ist es einfach Union.Rec.

Wenn es das ist was du meinst

PS: Warum nutzen so viele C Entwickler Chars statt Bytes? Ich versteh das einfach nicht
Dann doch lieber chrArr[sizeof(YourRecord)] und wozu noch händisch die Byte-Offsets der einzelnen Records berechnen, wenn man schon die union hat? vec[RecordIndex].Rec bzw. vec[RecordIndex].chrArr[ByteIndex] tut es doch.
MrSm!th is offline  
Old 05/09/2015, 16:59   #12
 
Crack-wtf's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 1,400
Received Thanks: 2,939
Hat sich erledigt, danke an alle.
Kann geschlossen werden.

Ps: Habe es so geregelt, dass ich direkt auf meinen Vector entschlüsselt habe und statt erst in ein array zu schreiben, eben direkt darauf schreibe.
Crack-wtf is offline  
Reply


Similar Threads Similar Threads
Vector ?
10/17/2014 - C/C++ - 6 Replies
Hey, wollte mal etwas Fragen (2 sachen). Ich verende Vectoren(möchte sie verwenden) in einen TCP Server den ich im Moment schreibe. Ich habe 2 Threads die die Vectors erstmal bearbeiten. Code: DWORD TCP_Server::Client_Accept_Thread() { sockaddr_in Clientinfo; int Clientinfolen = sizeof(Clientinfo);
[c++] help with sub-vector
05/22/2014 - C/C++ - 8 Replies
Well, i have a vector that stores objects of my class named 'Tools': vercotr<Tools>myvect that has lets say 5 objects saved in it... But now i want to make a method that makes a subvector from lets say 2nd (start) to 4th (end/finish) element in myvect and returns that newly created subvector. returnSubvect(2,4); that is returning: subvect Can anyone explain me how to do this? -Was strugling with this for some time now, but i cant get it to work.
Struct/MAP in struct speichern?
09/19/2013 - C/C++ - 26 Replies
Ich versuche momentan in einer Struct den datentyp map zu speichern, aber sobald ich es in der struct in der headerdatei mit reinpacke stirbt das Programm beim start. sieht ca so aus struct EventGift { DWORD dwID; int nCount; int nPercentage; };
Mw2 Vector
05/12/2011 - Call of Duty - 9 Replies
Stimmt das wenn man Schaldämpfer raufschrauft dass sich die Vector nicht mehr so verzieht



All times are GMT +1. The time now is 06:46.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.