1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <limits.h>
//Écrit un nombre en big-endian, octet par octet
writeNumber(void* buffer, unsigned long long number, size_t numberSize)
{
//Index commençant à 1 (on va de numberSize à 1 inclus)
unsigned char * byteBuffer = buffer;
size_t byte1basedIndex = numberSize;
for( byte1basedIndex = numberSize ; byte1basedIndex>0 ; byte1basedIndex--)
{
//Index commençant à zéro (va de numberSize-1 à zéro inclus)
size_t byte0basedIndex = byte1basedIndex - 1;
//On prend l'octet correspondant
unsigned char theByte = (unsigned char)(number >> (byte0basedIndex*CHAR_BIT));
//On l'écrit dans le buffer
*byteBuffer = theByte;
byteBuffer++;
}
}
char *creerMessage(int a, char b, char const*imprimante, char const*reference) {
char *message1;
message1= malloc(sizeof(unsigned int) + sizeof(char)
+ sizeof(uid_t) + sizeof(gid_t)
+ strlen(imprimante) + strlen(reference) + 2);
if(message1 != NULL) {
char* ecriture = message1;
//On écrit en avançant le pointeur à chaque fois
writeNumber(ecriture, a, sizeof(int));
ecriture += sizeof(int);
writeNumber(ecriture, b, sizeof(char));
ecriture += sizeof(char);
writeNumber(ecriture, getuid(), sizeof(uid_t));
ecriture += sizeof(uid_t);
writeNumber(ecriture, getgid(), sizeof(gid_t));
ecriture += sizeof(gid_t);
memcpy(ecriture, imprimante, strlen(imprimante)+1);
ecriture += strlen(imprimante)+1;
memcpy(ecriture, reference, strlen(reference)+1);
ecriture += strlen(reference)+1;
}
return (message1);
}
int main(void){
char const *message1;
char const *message2;
char * message3;
message1 = "loulou";
message2 = "lala";
message3 = creerMessage(42, 1, message1, message2);
//On ne peut pas afficher le message obtenu avec printf() vu qu'il contient des données binaires
free(message3);
return 0;
} |
Partager