Je lisons un gros fichier de disque. Ce fichier contient simplement des chiffres, codés comme anciens ASCII. Pour le moment, je lis dans des morceaux, puis faites quelque chose comme ceci:
byte[] token; // bytes representing a bunch of numbers int n = Integer.parseInt(new String(token));
3 Réponses :
int n=0; for(byte b : token) n = 10*n + (b-'0');
Si vous lisez un flux de caractères ASCII, la commande est déjà prise en charge, à droite, ou il manque quelque chose?
Il n'y a pas de problème d'Endian ici. Cependant, une culture écrit-t-elle d'abord un chiffre le plus bas? Dites en arabe, nous voyons des choses comme عام 2013 هو عام جيد code>. Nous savons que l'arabe est écrit de droite à gauche, alors ici le nombre arabe est écrit avec le chiffre le plus bas en premier? Aucune idée.
Cela semble assez prometteur! La commande n'est pas un problème, il est laissé à droite comme prévu. En outre, aucune astuce de langue étrangère ne se soucie de. Je vais le tester dans un peu et vous laisser savoir :)
Merci! Pour intérêt, cela a abouti à une vitesse d'environ 28%.
Comment convertir ce retour à la chaîne en tableau d'octets?
Vous ne pouvez pas faire des arithmétiques binaires exactement avec les numéros de base 10, mais vous pouvez faire des arithmétiques décimales. En supposant que les chiffres supérieurs d'ordre arrivent en premier:
byte[] token; long n = 0; long pow = 1; for( int i = token.length - 1; i >= 0; i-- ) { n += (token[i]-48) * pow; pow *= 10; }
Essayez sortie p>
C'est essentiellement la même chose que mon approche initiale. Je ne voulais pas les frais généraux supplémentaires de la création de nouvelles chaînes, puis de les analyser à l'INT.
Comment les numéros sont-ils délimités dans le fichier d'entrée?
At-il des entiers négatifs?
@Proception: Pas besoin de vous inquiéter de cela, j'ai déjà géré la délimination. Je fais la scission des morceaux d'octets [] aussi vite que possible.
@KuriousCoder: bonne question, pas de négatifs.