byte[] non signé BigInteger?
Motivation:
Je voudrais le convertir hachages (MD5/SHA1 etc) en décimal les nombres entiers dans le but de faire des codes à barres en Code128C.
Pour des raisons de simplicité, je préfère les (grandes) de nombres positifs.
Je suis capable de convertir byte[] pour BigInteger en C#...
L'échantillon de ce que j'ai à ce jour:
byte[] data;
byte[] result;
BigInteger biResult;
result = shaM.ComputeHash(data);
biResult = new BigInteger(result);
Mais (rusty CS) suis-je correct qu'un tableau d'octets peut toujours être interprétée de deux façons:
Un: que la signature d'un certain nombre
B: un nombre non signé
Est-il possible de faire un UNSIGNED BigInteger à partir d'un byte[] en C#?
Devrais-je simplement ajouter un 0x00 (de zéro octet) à l'avant du byte[]?
EDIT:
Merci à AakashM, Jon et Adam Robinson, en ajoutant un zéro octet réalisé que j'avais besoin.\
EDIT2:
La principale chose que j'ai dû faire était de lire la doc détaillée de la BigInteger(byte[]) constructeur, alors que j'aurais vu les articles sur la façon de restreindre à des nombres positifs en ajoutant le zéro octet.
- vous devez marquer accepté de répondre à
Vous devez vous connecter pour publier un commentaire.
La commentaires pour le
BigInteger
constructeur état que vous pouvez assurez-vous que toutBigInteger
créé à partir d'unbyte[]
est pas signé, si vous ajoutez un00
octet à la fin du tableau avant d'appeler le constructeur.Remarque: le
BigInteger
constructeur s'attend à ce que la matrice soit en little-endian commande. Gardez cela à l'esprit si vous pensez que le résultantBigInteger
avoir une valeur particulière.Examen la documentation de la
BigInteger
constructeur, nous voyons:[...]
[...]
Ce qui est plus correct est que tous les nombres (par le fait d'être stockés dans l'ordinateur) sont en fait une série d'octets, qu'est ce qu'un tableau d'octets est. Ce n'est pas vrai de dire qu'un tableau d'octets peut toujours être interprétée comme un signés ou non signés version particulière d'un type numérique, comme tous les types numériques ont signés et non signés versions. Virgule flottante types n'ont généralement des versions signées (il n'y a pas
udouble
ouufloat
), et, dans ce cas particulier, il n'existe pas de version non signée deBigInteger
.Donc, en d'autres termes, non, il n'est pas possible, mais depuis
BigInteger
peut représenter un arbitrairement grande valeur entière, vous ne perdez pas toute la gamme en vertu de son être signé.Quant à votre deuxième question, vous devez ajouter
0x00
à la fin fin de la matrice, comme leBigInteger
constructeur analyse les valeurs de poids faible octet de commande.Comme d'autres réponses ont souligné, vous devez ajouter un 00 octet à la fin du tableau pour que la BigInteger est positif.
Selon la le BigInteger Structure (Système d'.Numerics) la Documentation MSDN
Voici le code pour le faire:
Une alternative est de créer un
BigInteger
à l'aide de votre tableau d'octets, puis utilisezAbs
(équivalent àMath.Abs
) pour en faire une valeur absolue:Techniquement, vous ne devez utiliser
Abs
sibi
est négatif (par exemple, sibi.Sign == -1
)À compter de la date de ce post, le contractant pour l'BigInteger a maintenant un paramètre facultatif "isUnsigned". (vérifié pour le noyau .Net)