6
votes

Manière rapide de convertir une chaîne d'octets [] à sa valeur entière

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));


4 commentaires

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.


3 Réponses :


7
votes
    int n=0;
    for(byte b : token)
        n = 10*n + (b-'0');

5 commentaires

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 هو عام جيد . 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?



2
votes

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;
}


0 commentaires

0
votes

Essayez xxx

sortie xxx


1 commentaires

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.