2010-12-11 3 views
1

Donc, pour un projet où l'espace compte vraiment, j'aimerais pouvoir écrire dans un fichier un nombre qui prend TROIS octets. Donc, essentiellement, un type non signé où 16,777,215 est le nombre le plus élevé possible.Question très simple sur la création de groupes d'octets de taille non standard

Le numéro est donné comme un entier non signé, et j'ai déjà vérifié qu'il est compris entre 0 et 16 777 215. Comment puis-je aller au-delà de cela?

Le code en Java est préféré, mais ANSI C fonctionne aussi. Merci!

+0

Vous pouvez utiliser des unions en C. _Sans code, ce n'est donc pas une réponse._ – khachik

+1

Wow, vous pouvez écrire une valeur de trois octets dans un fichier en utilisant des unions sans code en C ?? Je suis impressionné. –

+0

@Peter peut-être que je n'ai pas eu votre blague, mais l'OP a posé des questions sur le code, et je suis paresseux maintenant pour l'écrire :) – khachik

Répondre

2

Vous pouvez

int number = 
OutputStream os = 
os.write(number >> 16); 
os.write(number >> 8); 
os.write(number); 

Pour lire

InputStream is = 
int number = ((is.read() & 0xFF) << 16) | ((is.read() & 0xFF) << 8) | (is.read() & 0xFF) 

Cependant, étant donné le coût d'un octet est si trivial, vous devez sauver énormément d'entre eux pour rendre la complexité supplémentaire vaut la peine il. Je l'ai seulement inclus ici pour votre information.

2 TB of disk space is worth about $100 
1 GB is worth about 5 cents 
1 MB is worth about 0.005 cents 
1 KB is worth about 0.000005 cents. 
1 B is worth about 0.000000005 cents. 

À titre de comparaison, au salaire minimum, (Vous pouvez évaluer votre temps plus fortement)

1 minute of your time, 12 cents. ~2 GB. 
1 second, 0.2 cents. ~40 MB. 
1 key, 0.2 seconds, 0.04 cents ~8 MB. 
1 blink. 0.05 seconds, 0.01 cents ~2 MB. 

Cela rend la suggestion plutôt inquiétante que ne vaut pas appuyer sur une touche pour enregistrer moins de 8 MB. Vous pourriez même arriver à la conclusion que cela ne vaut pas un seul changement de code, sauf si elle économise 2 Go d'espace disque. : P

+0

Eh bien, peut-être qu'il programme du fer électrique ou un lave-vaisselle, ou a juste besoin de stocker beaucoup de chiffres dans un téléphone mobile :) Il y a toujours des situations où économiser 1 octet à la fois est utile. –

+0

Qui peut dire qu'il les stocke sur disque? Peut-être qu'il stocke les données en flash intégré. Ou peut-être qu'il est préoccupé par la bande passante d'E/S. Pourquoi laisser passer l'opportunité d'utiliser 25% de bande passante d'E/S en moins? – Gabe

+0

S'il veut réduire les nombres, il pourrait utiliser l'encodage par bits d'arrêt. (Une méthode de compression simple) De cette façon, les nombres peuvent être juste un octet. –

0

En C, vous pouvez toujours convertir le * int en * char, puis écrire les 3 octets les moins significatifs. Pour Big Endian, vous sautez le premier char et écrivez les trois autres, pour le petit boutiste, vous écrivez simplement les trois premiers octets.