int vector in char vector
-
wie könnte man am besten ein int array in ein char array copy.?
gegeben sei 1024int.?
-
memcpy(...)
Geht es um die Ausgabe der Daten auf irgendein Gerät?
Willst du weniger Speicherplatz verbrauchen?
Welchen Wertebereich haben die Daten im int-Array?Dafür gibt es unteschiedliche Lösungen.
-
DirkB schrieb:
memcpy(...)
das verträgt sich nur in ausnahmefällen mit unterschiedlichen datentypen...
-
Meinst du denn normale Arrays ("
char a[1024]
") oder std::vector, wie der Titel vermuten ließe? Du könntest std::copy benutzen. Dann wäre aber immer noch zu klären, ob du den Wert eines int-Elements einem char-Element zuweisen willst (dann hättest du potenziell Datenverlust, weil ein char nunmal viel kleiner ist als ein int) oder ob du es anders meinst. Also, was genau willst du machen?EDIT: Entschuldige, wir sind ja im C-Forum. Vergiss, was ich gesagt habe (außer das mit dem Datenverlust, das gilt natürlich weiterhin).
-
tam+ schrieb:
wie könnte man am besten ein int array in ein char array copy.?
Am besten in einer Schleife durchlaufen, und Zahl für Zahl kopieren. Das geht immer gut, abgesehen natürlich von char-Überläufen.
-
_matze schrieb:
dann hättest du potenziell Datenverlust, weil ein char nunmal viel kleiner ist als ein int
Sicher?
-
mngbd schrieb:
_matze schrieb:
dann hättest du potenziell Datenverlust, weil ein char nunmal viel kleiner ist als ein int
Sicher?
Theoretisch nicht (und selbst hier würde ich ohne weitere Kenntnis des Zielsystems sizeof(char)<=sizeof(int) als potenziellen Datenverlust werten), in der Praxis schon, wenn ich davon ausgehen darf, dass der Threadersteller nicht auf irgendeinem exotischen Mikrocontroller arbeitet, sondern auf einer handelsüblichen Windows-/Linux-Maschine. :p
-
Gibt es denn einen Mikrocontroller, dessen Bytes 16 Bit breit sind? Der C-Standard garantiert nämlich, dass int mindestens -32768 bis 32767 darstellen kann.
-
seldon schrieb:
Gibt es denn einen Mikrocontroller, dessen Bytes 16 Bit breit sind? Der C-Standard garantiert nämlich, dass int mindestens -32768 bis 32767 darstellen kann.
Es gibt Maschinen bei denen CHAR_BIT>8 ist, sogar >16. Aber gewöhnlicherweise sind deren ints natürlich auch noch einmal größer.
Von der Kombination sizeof(char)==sizeof(int) habe ich jedenfalls noch nie gehört. Bin aber auch nicht wirklich Experte darin.
-
SeppJ schrieb:
Von der Kombination sizeof(char)==sizeof(int) habe ich jedenfalls noch nie gehört. Bin aber auch nicht wirklich Experte darin.
Musst du ja auch nicht, und ich auch nicht. Es hat ja imho auch wenig Sinn, ständig darauf zu pochen, was laut Standard theoretisch alles vorkommen kann, wenn man doch eigentlich nie solche exotischen Varianten zu Gesicht bekommt (was für die meisten gelten dürfte).
-
_matze schrieb:
Es hat ja imho auch wenig Sinn, ständig darauf zu pochen, was laut Standard theoretisch alles vorkommen kann, wenn man doch eigentlich nie solche exotischen Varianten zu Gesicht bekommt (was für die meisten gelten dürfte).
Ja klar! Ich hab dich oben schlecht zitiert, mir ist es nur um das weil ein char nunmal viel kleiner ist als ein int gegangen. Das war mir eine Spur zu apodiktisch.
-
Ich habe ein int array von 1024 elementen.
int buffer[1024];
to
char buffer1[?];Jetzt möchte ich die Daten per send(); senden, dabei müssen sie aber in ein char Vektor.
-
Nein, muessen sie nicht.
-
Passen deine int-Werte verlustfrei in den char-Wertebereich?
Was erwartet deine Empfängerseite denn?
-
Die int Werte können auch 0xffffffff sein.
-
Für verlustfreie Übertragung musst du somit mit htonl auf Sende- und ntohl auf Empfängerseite arbeiten, d.h. dein int-Array entsprechend umwandeln bevor du es sendest. Mit einem char-Array aus deiner Ausgangsfrage hat das dann natürlich nichts mehr zu tun.
hton*/ntoh* sind zwar kein ANSI aber immerhin POSIX, dass sollte deine Bibliothek kennen.
-
tam+ schrieb:
Ich habe ein int array von 1024 elementen.
int buffer[1024];
to
char buffer1[?];Jetzt möchte ich die Daten per send(); senden, dabei müssen sie aber in ein char Vektor.
Der send-Funktion ist es egal ob die Daten int oder char ist. Sie möchte nur einen Zeiger auf den Anfang des zu sendenden Datenblocks haben. (Und die Anzahl)
Ein Meckern des Compilers kannst du durch casting entgehen.
Beachten musst du aber das ein int größer als ein char ist. (s. oben)#define FELD_LEN 1024 int feld[FELD_LEN]; send(fd,(char *)feld, FELD_LEN * sizeof(int),0);
@tam+
Wenn es nicht auf die Bits sondern nur auf den Wert ankommt ist 0xffffffff = -1.
-
DirkB schrieb:
Wenn es nicht auf die Bits sondern nur auf den Wert ankommt ist 0xffffffff = -1.
Oder auch nicht.
-
mngbd schrieb:
Oder auch nicht.
Gut OK ich habe das Zitat vergessen:
tam+ schrieb:
Die int Werte können auch 0xffffffff sein.
Da steht int. Und ja gut es sollten dann auch 32-bit Integers sein.
Und die ganzen Ausnahmen und Möglichkeiten sind hier ja schon abgehandelt.
-
SeppJ schrieb:
Von der Kombination sizeof(char)==sizeof(int) habe ich jedenfalls noch nie gehört. Bin aber auch nicht wirklich Experte darin.
Hier mal ein Beispiel: http://focus.ti.com/lit/ug/spru514c/spru514c.pdf (Seite 82).
-
DirkB schrieb:
Gut OK ich habe das Zitat vergessen:
tam+ schrieb:
Die int Werte können auch 0xffffffff sein.
Da steht int. Und ja gut es sollten dann auch 32-bit Integers sein.
Und alle negativen 32-Bit-ints müssen im Zweierkomplement dargestellt werden?