奔三 发表于 2023-7-18 23:33:31

C# 和 OpenResty 中进行 CRC32

一、C# 进行 CRC32

public class CRC32
{
    private static readonly uint[] _crc32Table;
    static CRC32()
    {
      uint crc;
      _crc32Table = new uint;
      int i, j;
      for (i = 0; i < 256; i++)
      {
            crc = (uint)i;
            for (j = 8; j > 0; j--)
            {
                if ((crc & 1) == 1)
                  crc = (crc >> 1) ^ 0xEDB88320;
                else
                  crc >>= 1;
            }
            _crc32Table = crc;
      }
    }

    /// <summary>
    /// 获取CRC32校验值
    /// </summary>
    public static uint GetCRC32(byte[] bytes)
    {
      uint value = 0xffffffff;
      int len = bytes.Length;
      for (int i = 0; i < len; i++)
      {
            value = (value >> 8) ^ _crc32Table[(value & 0xFF) ^ bytes];
      }
      return value ^ 0xffffffff;
    }

    /// <summary>
    /// 获取CRC32校验值
    /// </summary>
    public static uint GetCRC32(string str)
    {
      byte[] bytes = Encoding.UTF8.GetBytes(str);
      return GetCRC32(bytes);
    }
}使用方法
string dataStr = "1234567890";
var crcUint = CRC32.GetCRC32(dataStr);
var crcHex = string.Format("{0:X8}", crcUint);
Console.WriteLine($"{dataStr} => CRC32 Uint: {crcUint}, Hex: {crcHex}");结果:1234567890 => CRC32 Uint: 639479525, Hex: 261DAEE5
 
二、OpenResty 中进行 CRC32

location /lua_crc {
    content_by_lua_block
    {
      local str = "1234567890"
      local crc32_long =ngx.crc32_long(str)
      ngx.say(str .. " => CRC32 long: " .. crc32_long, "</br>")
    }
}结果:1234567890 => CRC32 long: 639479525
C# 和 OpenResty 中进行 CRC32 的结果是一致的。
 

来源:https://www.cnblogs.com/anjou/archive/2023/07/18/crc32.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: C# 和 OpenResty 中进行 CRC32