我正试图为Kraken交易所的订单簿生成CRC32校验和,如下所述。我在SO中发现了另一篇引用这个Github文件的帖子,以便生成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"
。
很明显,我在这里一定是做错了什么。我错过了什么?
ComputeHash
返回byte[]
,因此您将返回四个字节。您的974947235
变为十六进制3a, 1c, 83, a3
。或十进制58, 28, 131, 163
。试图将随机字节打印为字符只会导致焦虑和沮丧。将它们打印为数字。请注意,58是冒号(":"(字符,所以实际上您的第一个字符是正确的。
顺便说一句,有很多CRC-32,但您似乎偶然找到了正确的,因为您提供的字符串确实产生了CRC-32/ISO-HDLC:974947235
。
Mark的帖子让我成功了一半。我找到的解决方案是转换为十六进制,然后将该十六进制转换为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);