使用输入字符串在C#中生成CRC32校验和

时间:2020-10-16 13:43:26

标签: c# checksum crc32

我正尝试为here中所述的Kraken交易所的订单生成CRC32校验和。我在SO中找到另一篇引用this Github file的帖子,以生成CRC32校验和。我遇到的问题是,我需要根据输入string生成校验和,在该输入中,我发现的所有校验和函数都将byte[]作为输入。

我尝试将string转换为byte[],但是并没有给我预期的结果,这是按照Kraken文档获取的。

string inputString = "50055005010500501550050205005025500503050050355005040500504550050505005000500499550049905004980500497550049705004965500496050049555004950500";
        
Crc32 crc32 = new Crc32();
var byteArr = crc32.ComputeHash(Encoding.ASCII.GetBytes(inputString));
    
Console.WriteLine(Encoding.ASCII.GetString(byteArr));

此日志记录的值为":??",我应该在其中获取"974947235"

很明显,我在这里一定做错了什么。我想念什么?

2 个答案:

答案 0 :(得分:1)

ComputeHash返回byte[],因此您将获得四个字节。您的974947235变成3a, 1c, 83, a3的十六进制。或十进制58, 28, 131, 163。尝试将随机字节打印为字符只会导致焦虑和沮丧。将它们打印为数字。请注意,58是冒号(“:”)字符,因此实际上您的第一个字符是正确的。

顺便说一下,有很多CRC-32,但是您似乎偶然发现了正确的CRC-32,因为您提供的字符串确实导致了CRC-32/ISO-HDLC974947235

答案 1 :(得分:0)

Mark's post带我到了一半。我发现的解决方案是将其转换为十六进制,然后将其转换为int,如下所示:

Crc32 crc32 = new Crc32();
byte[] byteArr = crc32.ComputeHash(Encoding.ASCII.GetBytes(s));

string hex = BitConverter.ToString(byteArr);

int desiredInt = int.Parse(
   hex.Replace("-", string.Empty),
   System.Globalization.NumberStyles.HexNumber);