Re bonsoir,
J'ai honte de poster autant de question mais le binaire c'est clairement pas mon fort donc si je le fais pas et que je n'ai pas de coup de pouce je pense rester sur cette partie très longtemps alors je tente..
Iradrille m'a passé ce jolie code qui me permet d'écrire dans l'endianess que je souhaite à peu près tout ce que je souhaite :
Je l'ai quelque peu modifier pour que ça n'écrive pas directement dans le fichier mais plutôt en mémoire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <iostream> #include <fstream> #include <stdint.h> template <size_t> struct unsigned_ { }; template <> struct unsigned_<1> { typedef uint8_t type; }; template <> struct unsigned_<2> { typedef uint16_t type; }; template <> struct unsigned_<4> { typedef uint32_t type; }; template <> struct unsigned_<8> { typedef uint64_t type; }; template <class T> void write(T val, std::ostream& os, bool big_endian=true) { const size_t size = sizeof(T); typedef unsigned_<size>::type type; for(size_t i=0; i<size; ++i) { type *ptr = reinterpret_cast<type*>(&val); os << static_cast<unsigned char>(((*ptr) >> (big_endian ? size-i-1: i)*8)); } }
Maintenant dans data j'ai mes valeurs mais j'aimerai à présent faire la manipulation inverse, un read plus précisément.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 template <class T> void write(T val, char *data, bool big_endian=true) { const size_t size = sizeof(T); typedef unsigned_<size>::type type; type *ptr = reinterpret_cast<type*>(&val); unsigned char c[size]; for(size_t i=0; i<size; ++i) c[i] << static_cast<unsigned char>(((*ptr) >> (big_endian ? size-i-1: i)*8)); memcpy(data, c, size); } //et plus loins je fais le write de data dans le fichier
J'ai beau tourner le truc dans tous les sens impossible que ca compile ou que ca fonctionne:
Merci encore pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 emplate <class T> void read(T *val, char *data, bool big_endian=true) { const size_t size = sizeof(T); typedef unsigned_<size>::type type; type *ptr = reinterpret_cast<type*>(&val); unsigned char c[size]; memcpy(c, data, size); // Je prends la zone mémoire concernée for(size_t i=0; i<size; ++i) static_cast<unsigned char>(((*ptr) >> (big_endian ? size-i-1: i)*8)) = c[i]; // Ce que j'aurai voulu faire mais pas possible d'assigner à un cast }
Partager