Comment puis-je calculer le CRC32 comme un entier signé en C#?
Je suis un développeur PHP et un peu hors de mon élément en C#. En PHP, il y a un crc32() la fonction qui renvoie un entier signé pour une chaîne que vous avez passé.
C'est ce que je suis:
<?php
echo crc32("test");
//displays -662733300
Je voudrais faire la même chose en C#. Je suis tombé sur cette bibliothèque de classes C# , mais de comprendre peu à ce sujet. Selon ses instructions, je suis censé le faire:
//first convert string to byte-array
String input = "test";
byte[] bytes = new byte[input.length * sizeof(char)];
System.Buffer.BlockCopy(input.ToCharArray(), 0, bytes, 0, bytes.Length);
//then calculate the value
Crc32 crc32 = new Crc32();
String output = "";
foreach (byte b in crc32.ComputeHash(bytes))
{
output += b.ToString("x2").ToLower();
}
Qui me donne une sortie de la chaîne de 27d86d6a
. Que dois-je faire à la place de retourner un entier signé? (Dans cet exemple, doit être égale à -662733300
)
Plusieurs références à des .net crc calculatrices ici
pas sûr, mais autant que je sache, c'est la façon dont PHP a toujours été mis en œuvre (sur les machines 32 bits, de toute façon). Pour mes besoins, j'ai besoin de quelque chose qui va être en conformité avec ce comportement.
à partir du lien que vous avez posté: "Parce que PHP est de type entier signé de nombreux crc32 les sommes de contrôle entraînera des entiers négatifs sur les plates-formes 32 bits. Sur 64 bits installations crc32() les résultats seront des entiers positifs. Si vous avez besoin d'utiliser le "%u" formateur de sprintf() ou printf() pour obtenir la représentation de chaîne de la unsigned crc32() somme de contrôle en format décimal."
pas sûr, mais autant que je sache, c'est la façon dont PHP a toujours été mis en œuvre (sur les machines 32 bits, de toute façon). Pour mes besoins, j'ai besoin de quelque chose qui va être en conformité avec ce comportement.
à partir du lien que vous avez posté: "Parce que PHP est de type entier signé de nombreux crc32 les sommes de contrôle entraînera des entiers négatifs sur les plates-formes 32 bits. Sur 64 bits installations crc32() les résultats seront des entiers positifs. Si vous avez besoin d'utiliser le "%u" formateur de sprintf() ou printf() pour obtenir la représentation de chaîne de la unsigned crc32() somme de contrôle en format décimal."
OriginalL'auteur soapergem | 2014-01-17
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser BitConverter.ToInt32 méthode:
MODIFIER
Il semble que vous utilisez différentes algorithme Crc32, mise en œuvre, essayez la suivante:
Démo
test
retourne1785583655
, mais il doit donner-662733300
Ok, voir mon jour de réponse.
C'est absolument parfait! Merci!!!! (Et en passant, je devine que vous avez accroché une partie de ce que le code source PHP?)
Oui, du genre 🙂
vous pouvez vous débarrasser de la
BlockCopy
et l'utilisationbyte[] bytes = System.Text.Encoding.UTF8.GetBytes(input);
à la place.OriginalL'auteur Tony