2012-03-22 4 views
2

J'ai une chaîne binaire, direconvertir ruby ​​Chaîne à Bignum

x = "c1\x98\xCCf3\x1C\x00.\x01\xC7\x00\xC0" 

(en réalité beaucoup plus). J'ai besoin de le représenter sous la forme de Bignum, afin de poursuivre la conversion en séquences de base-quelque chose (quelque chose> 36).

x.unpack('H*')[0].to_i 

donne un entier à partir des premiers octets de la valeur, et non un Bignum.

+0

Dans Ruby, le type Integer et englobe Fixnum bignums. Pourquoi dites-vous que ce n'est pas un Bignum? Je reçois 'Bignum' quand je dis' x.unpack ('H *') [0] .to_i.class' où 'x' est très grand. –

+2

@Ray: Vous devez avoir de la chance et ne pas toucher de chiffres non décimaux jusqu'à ce que vous obteniez assez loin pour un Bignum. –

Répondre

5

Il n'y a pas besoin d'utiliser unpack et passer par une représentation de chaîne hexagonale intermédiaire.

Pour convertir une chaîne binaire directement à un numéro (qui sera automatiquement Bignum au besoin), vous pouvez faire:

"\xc1\x98\xCC\xf3\x1C\x00".bytes.inject {|a, b| (a << 8) + b } 
=> 212862017674240 
5

La base par défaut pour String#to_i est, bien sûr, 10 mais vous essayez de convertir l'hexagone de sorte que vous voulez .to_i(16). Si vous ne spécifiez pas la base, to_i s'arrêtera lorsqu'il verra la première valeur non décimale et que c'est de là que vient votre troncature.

Vous voulez dire:

x.unpack('H*')[0].to_i(16) 

Par exemple:

>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i 
=> 633198 
>> "633198cc66331c0001c700c0633198cc66331c0001c700c063312e98cc66331c0001c700c0".to_i(16) 
=> 49331350698902676183344474146684368690988113012187221237314170009285390086987127695278272 
Questions connexes