C# 和 OpenResty 中进行 CRC32

一、C# 进行 CRC32

public class CRC32
{
    private static readonly uint[] _crc32Table;
    static CRC32()
    {
        uint crc;
        _crc32Table = new uint[256];
        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[i] = 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[i]];
        }
        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 的结果是一致的。

 

posted on 2023-07-18 21:31  大豆男生  阅读(298)  评论(0编辑  收藏  举报

导航