天天看點

【CRC】CRC推導(八)CRC64的各種實作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CRC.CRC64
{
    class CRC64
    {
        /*
         *  Algorithm           Poly                Init       	        RefIn 	RefOut 	XorOut     
            CRC-64_ECMA_182	    0x42F0E1EBA9EA3693	0x0000000000000000	false	false	0x0000000000000000
            CRC-64_GO_ISO       0x000000000000001B	0xFFFFFFFFFFFFFFFF	true	true	0xFFFFFFFFFFFFFFFF
            CRC-64_WE           0x42F0E1EBA9EA3693	0xFFFFFFFFFFFFFFFF	false	false	0xFFFFFFFFFFFFFFFF
            CRC-64_XZ	        0x42F0E1EBA9EA3693	0xFFFFFFFFFFFFFFFF	true	true	0xFFFFFFFFFFFFFFFF
         */

        public struct Scm_CRC64_InputParameters
        {
            /// <summary>
            /// 算法名稱
            /// </summary>
            public string AlgorithmName;

            /// <summary>
            /// 是否大端模式,
            /// 大端模式,高位元組在前,左移計算,多項式無需反轉
            /// 小端模式,低位元組在前,右移計算,多項式需反轉
            /// </summary>
            public bool LittleEndian;

            /// <summary>
            /// 多項式
            /// </summary>
            public UInt64 Polynomial;

            /// <summary>
            /// crc寄存器寬度
            /// 隻讀
            /// </summary>
            public int cWidth { get { return sizeof(UInt64) / sizeof(byte) * 8; } }

            /// <summary>
            /// 資料
            /// </summary>
            public byte[] Datas;
            /// <summary>
            /// 初始crc值
            /// </summary>
            public UInt64 InitCrc;
            /// <summary>
            /// 輸入反轉
            /// </summary>
            public bool RefIn;
            /// <summary>
            /// 輸出反轉
            /// </summary>
            public bool RefOut;

            /// <summary>
            /// 輸出是否異或
            /// </summary>
            //public bool isOutputXor;

            /// <summary>
            /// 輸出異或值
            /// </summary>
            public UInt64 XorOut;
        }


        #region Table
        readonly UInt64[] Crc64_Poly42F0E1EBA9EA3693_Table64_Reflect = new UInt64[256]
        {
        0x0000000000000000, 0xB32E4CBE03A75F6F, 0xF4843657A840A05B, 0x47AA7AE9ABE7FF34, 0x7BD0C384FF8F5E33, 0xC8FE8F3AFC28015C, 0x8F54F5D357CFFE68, 0x3C7AB96D5468A107,
        0xF7A18709FF1EBC66, 0x448FCBB7FCB9E309, 0x0325B15E575E1C3D, 0xB00BFDE054F94352, 0x8C71448D0091E255, 0x3F5F08330336BD3A, 0x78F572DAA8D1420E, 0xCBDB3E64AB761D61,
        0x7D9BA13851336649, 0xCEB5ED8652943926, 0x891F976FF973C612, 0x3A31DBD1FAD4997D, 0x064B62BCAEBC387A, 0xB5652E02AD1B6715, 0xF2CF54EB06FC9821, 0x41E11855055BC74E,
        0x8A3A2631AE2DDA2F, 0x39146A8FAD8A8540, 0x7EBE1066066D7A74, 0xCD905CD805CA251B, 0xF1EAE5B551A2841C, 0x42C4A90B5205DB73, 0x056ED3E2F9E22447, 0xB6409F5CFA457B28,
        0xFB374270A266CC92, 0x48190ECEA1C193FD, 0x0FB374270A266CC9, 0xBC9D3899098133A6, 0x80E781F45DE992A1, 0x33C9CD4A5E4ECDCE, 0x7463B7A3F5A932FA, 0xC74DFB1DF60E6D95,
        0x0C96C5795D7870F4, 0xBFB889C75EDF2F9B, 0xF812F32EF538D0AF, 0x4B3CBF90F69F8FC0, 0x774606FDA2F72EC7, 0xC4684A43A15071A8, 0x83C230AA0AB78E9C, 0x30EC7C140910D1F3,
        0x86ACE348F355AADB, 0x3582AFF6F0F2F5B4, 0x7228D51F5B150A80, 0xC10699A158B255EF, 0xFD7C20CC0CDAF4E8, 0x4E526C720F7DAB87, 0x09F8169BA49A54B3, 0xBAD65A25A73D0BDC,
        0x710D64410C4B16BD, 0xC22328FF0FEC49D2, 0x85895216A40BB6E6, 0x36A71EA8A7ACE989, 0x0ADDA7C5F3C4488E, 0xB9F3EB7BF06317E1, 0xFE5991925B84E8D5, 0x4D77DD2C5823B7BA,
        0x64B62BCAEBC387A1, 0xD7986774E864D8CE, 0x90321D9D438327FA, 0x231C512340247895, 0x1F66E84E144CD992, 0xAC48A4F017EB86FD, 0xEBE2DE19BC0C79C9, 0x58CC92A7BFAB26A6,
        0x9317ACC314DD3BC7, 0x2039E07D177A64A8, 0x67939A94BC9D9B9C, 0xD4BDD62ABF3AC4F3, 0xE8C76F47EB5265F4, 0x5BE923F9E8F53A9B, 0x1C4359104312C5AF, 0xAF6D15AE40B59AC0,
        0x192D8AF2BAF0E1E8, 0xAA03C64CB957BE87, 0xEDA9BCA512B041B3, 0x5E87F01B11171EDC, 0x62FD4976457FBFDB, 0xD1D305C846D8E0B4, 0x96797F21ED3F1F80, 0x2557339FEE9840EF,
        0xEE8C0DFB45EE5D8E, 0x5DA24145464902E1, 0x1A083BACEDAEFDD5, 0xA9267712EE09A2BA, 0x955CCE7FBA6103BD, 0x267282C1B9C65CD2, 0x61D8F8281221A3E6, 0xD2F6B4961186FC89,
        0x9F8169BA49A54B33, 0x2CAF25044A02145C, 0x6B055FEDE1E5EB68, 0xD82B1353E242B407, 0xE451AA3EB62A1500, 0x577FE680B58D4A6F, 0x10D59C691E6AB55B, 0xA3FBD0D71DCDEA34,
        0x6820EEB3B6BBF755, 0xDB0EA20DB51CA83A, 0x9CA4D8E41EFB570E, 0x2F8A945A1D5C0861, 0x13F02D374934A966, 0xA0DE61894A93F609, 0xE7741B60E174093D, 0x545A57DEE2D35652,
        0xE21AC88218962D7A, 0x5134843C1B317215, 0x169EFED5B0D68D21, 0xA5B0B26BB371D24E, 0x99CA0B06E7197349, 0x2AE447B8E4BE2C26, 0x6D4E3D514F59D312, 0xDE6071EF4CFE8C7D,
        0x15BB4F8BE788911C, 0xA6950335E42FCE73, 0xE13F79DC4FC83147, 0x521135624C6F6E28, 0x6E6B8C0F1807CF2F, 0xDD45C0B11BA09040, 0x9AEFBA58B0476F74, 0x29C1F6E6B3E0301B,
        0xC96C5795D7870F42, 0x7A421B2BD420502D, 0x3DE861C27FC7AF19, 0x8EC62D7C7C60F076, 0xB2BC941128085171, 0x0192D8AF2BAF0E1E, 0x4638A2468048F12A, 0xF516EEF883EFAE45,
        0x3ECDD09C2899B324, 0x8DE39C222B3EEC4B, 0xCA49E6CB80D9137F, 0x7967AA75837E4C10, 0x451D1318D716ED17, 0xF6335FA6D4B1B278, 0xB199254F7F564D4C, 0x02B769F17CF11223,
        0xB4F7F6AD86B4690B, 0x07D9BA1385133664, 0x4073C0FA2EF4C950, 0xF35D8C442D53963F, 0xCF273529793B3738, 0x7C0979977A9C6857, 0x3BA3037ED17B9763, 0x888D4FC0D2DCC80C,
        0x435671A479AAD56D, 0xF0783D1A7A0D8A02, 0xB7D247F3D1EA7536, 0x04FC0B4DD24D2A59, 0x3886B22086258B5E, 0x8BA8FE9E8582D431, 0xCC0284772E652B05, 0x7F2CC8C92DC2746A,
        0x325B15E575E1C3D0, 0x8175595B76469CBF, 0xC6DF23B2DDA1638B, 0x75F16F0CDE063CE4, 0x498BD6618A6E9DE3, 0xFAA59ADF89C9C28C, 0xBD0FE036222E3DB8, 0x0E21AC88218962D7,
        0xC5FA92EC8AFF7FB6, 0x76D4DE52895820D9, 0x317EA4BB22BFDFED, 0x8250E80521188082, 0xBE2A516875702185, 0x0D041DD676D77EEA, 0x4AAE673FDD3081DE, 0xF9802B81DE97DEB1,
        0x4FC0B4DD24D2A599, 0xFCEEF8632775FAF6, 0xBB44828A8C9205C2, 0x086ACE348F355AAD, 0x34107759DB5DFBAA, 0x873E3BE7D8FAA4C5, 0xC094410E731D5BF1, 0x73BA0DB070BA049E,
        0xB86133D4DBCC19FF, 0x0B4F7F6AD86B4690, 0x4CE50583738CB9A4, 0xFFCB493D702BE6CB, 0xC3B1F050244347CC, 0x709FBCEE27E418A3, 0x3735C6078C03E797, 0x841B8AB98FA4B8F8,
        0xADDA7C5F3C4488E3, 0x1EF430E13FE3D78C, 0x595E4A08940428B8, 0xEA7006B697A377D7, 0xD60ABFDBC3CBD6D0, 0x6524F365C06C89BF, 0x228E898C6B8B768B, 0x91A0C532682C29E4,
        0x5A7BFB56C35A3485, 0xE955B7E8C0FD6BEA, 0xAEFFCD016B1A94DE, 0x1DD181BF68BDCBB1, 0x21AB38D23CD56AB6, 0x9285746C3F7235D9, 0xD52F0E859495CAED, 0x6601423B97329582,
        0xD041DD676D77EEAA, 0x636F91D96ED0B1C5, 0x24C5EB30C5374EF1, 0x97EBA78EC690119E, 0xAB911EE392F8B099, 0x18BF525D915FEFF6, 0x5F1528B43AB810C2, 0xEC3B640A391F4FAD,
        0x27E05A6E926952CC, 0x94CE16D091CE0DA3, 0xD3646C393A29F297, 0x604A2087398EADF8, 0x5C3099EA6DE60CFF, 0xEF1ED5546E415390, 0xA8B4AFBDC5A6ACA4, 0x1B9AE303C601F3CB,
        0x56ED3E2F9E224471, 0xE5C372919D851B1E, 0xA26908783662E42A, 0x114744C635C5BB45, 0x2D3DFDAB61AD1A42, 0x9E13B115620A452D, 0xD9B9CBFCC9EDBA19, 0x6A978742CA4AE576,
        0xA14CB926613CF817, 0x1262F598629BA778, 0x55C88F71C97C584C, 0xE6E6C3CFCADB0723, 0xDA9C7AA29EB3A624, 0x69B2361C9D14F94B, 0x2E184CF536F3067F, 0x9D36004B35545910,
        0x2B769F17CF112238, 0x9858D3A9CCB67D57, 0xDFF2A94067518263, 0x6CDCE5FE64F6DD0C, 0x50A65C93309E7C0B, 0xE388102D33392364, 0xA4226AC498DEDC50, 0x170C267A9B79833F,
        0xDCD7181E300F9E5E, 0x6FF954A033A8C131, 0x28532E49984F3E05, 0x9B7D62F79BE8616A, 0xA707DB9ACF80C06D, 0x14299724CC279F02, 0x5383EDCD67C06036, 0xE0ADA17364673F59
        };

        readonly UInt64[] Crc64_Poly42F0E1EBA9EA3693_Table64 = new UInt64[256]
        {
        0x0000000000000000, 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, 0xC711223CFA3E5BB5, 0x493366450E42ECDF, 0x0BC387AEA7A8DA4C, 0xCCD2A5925D9681F9, 0x8E224479F47CB76A,
        0x9266CC8A1C85D9BE, 0xD0962D61B56FEF2D, 0x17870F5D4F51B498, 0x5577EEB6E6BB820B, 0xDB55AACF12C73561, 0x99A54B24BB2D03F2, 0x5EB4691841135847, 0x1C4488F3E8F96ED4,
        0x663D78FF90E185EF, 0x24CD9914390BB37C, 0xE3DCBB28C335E8C9, 0xA12C5AC36ADFDE5A, 0x2F0E1EBA9EA36930, 0x6DFEFF5137495FA3, 0xAAEFDD6DCD770416, 0xE81F3C86649D3285,
        0xF45BB4758C645C51, 0xB6AB559E258E6AC2, 0x71BA77A2DFB03177, 0x334A9649765A07E4, 0xBD68D2308226B08E, 0xFF9833DB2BCC861D, 0x388911E7D1F2DDA8, 0x7A79F00C7818EB3B,
        0xCC7AF1FF21C30BDE, 0x8E8A101488293D4D, 0x499B3228721766F8, 0x0B6BD3C3DBFD506B, 0x854997BA2F81E701, 0xC7B97651866BD192, 0x00A8546D7C558A27, 0x4258B586D5BFBCB4,
        0x5E1C3D753D46D260, 0x1CECDC9E94ACE4F3, 0xDBFDFEA26E92BF46, 0x990D1F49C77889D5, 0x172F5B3033043EBF, 0x55DFBADB9AEE082C, 0x92CE98E760D05399, 0xD03E790CC93A650A,
        0xAA478900B1228E31, 0xE8B768EB18C8B8A2, 0x2FA64AD7E2F6E317, 0x6D56AB3C4B1CD584, 0xE374EF45BF6062EE, 0xA1840EAE168A547D, 0x66952C92ECB40FC8, 0x2465CD79455E395B,
        0x3821458AADA7578F, 0x7AD1A461044D611C, 0xBDC0865DFE733AA9, 0xFF3067B657990C3A, 0x711223CFA3E5BB50, 0x33E2C2240A0F8DC3, 0xF4F3E018F031D676, 0xB60301F359DBE0E5,
        0xDA050215EA6C212F, 0x98F5E3FE438617BC, 0x5FE4C1C2B9B84C09, 0x1D14202910527A9A, 0x93366450E42ECDF0, 0xD1C685BB4DC4FB63, 0x16D7A787B7FAA0D6, 0x5427466C1E109645,
        0x4863CE9FF6E9F891, 0x0A932F745F03CE02, 0xCD820D48A53D95B7, 0x8F72ECA30CD7A324, 0x0150A8DAF8AB144E, 0x43A04931514122DD, 0x84B16B0DAB7F7968, 0xC6418AE602954FFB,
        0xBC387AEA7A8DA4C0, 0xFEC89B01D3679253, 0x39D9B93D2959C9E6, 0x7B2958D680B3FF75, 0xF50B1CAF74CF481F, 0xB7FBFD44DD257E8C, 0x70EADF78271B2539, 0x321A3E938EF113AA,
        0x2E5EB66066087D7E, 0x6CAE578BCFE24BED, 0xABBF75B735DC1058, 0xE94F945C9C3626CB, 0x676DD025684A91A1, 0x259D31CEC1A0A732, 0xE28C13F23B9EFC87, 0xA07CF2199274CA14,
        0x167FF3EACBAF2AF1, 0x548F120162451C62, 0x939E303D987B47D7, 0xD16ED1D631917144, 0x5F4C95AFC5EDC62E, 0x1DBC74446C07F0BD, 0xDAAD56789639AB08, 0x985DB7933FD39D9B,
        0x84193F60D72AF34F, 0xC6E9DE8B7EC0C5DC, 0x01F8FCB784FE9E69, 0x43081D5C2D14A8FA, 0xCD2A5925D9681F90, 0x8FDAB8CE70822903, 0x48CB9AF28ABC72B6, 0x0A3B7B1923564425,
        0x70428B155B4EAF1E, 0x32B26AFEF2A4998D, 0xF5A348C2089AC238, 0xB753A929A170F4AB, 0x3971ED50550C43C1, 0x7B810CBBFCE67552, 0xBC902E8706D82EE7, 0xFE60CF6CAF321874,
        0xE224479F47CB76A0, 0xA0D4A674EE214033, 0x67C58448141F1B86, 0x253565A3BDF52D15, 0xAB1721DA49899A7F, 0xE9E7C031E063ACEC, 0x2EF6E20D1A5DF759, 0x6C0603E6B3B7C1CA,
        0xF6FAE5C07D3274CD, 0xB40A042BD4D8425E, 0x731B26172EE619EB, 0x31EBC7FC870C2F78, 0xBFC9838573709812, 0xFD39626EDA9AAE81, 0x3A28405220A4F534, 0x78D8A1B9894EC3A7,
        0x649C294A61B7AD73, 0x266CC8A1C85D9BE0, 0xE17DEA9D3263C055, 0xA38D0B769B89F6C6, 0x2DAF4F0F6FF541AC, 0x6F5FAEE4C61F773F, 0xA84E8CD83C212C8A, 0xEABE6D3395CB1A19,
        0x90C79D3FEDD3F122, 0xD2377CD44439C7B1, 0x15265EE8BE079C04, 0x57D6BF0317EDAA97, 0xD9F4FB7AE3911DFD, 0x9B041A914A7B2B6E, 0x5C1538ADB04570DB, 0x1EE5D94619AF4648,
        0x02A151B5F156289C, 0x4051B05E58BC1E0F, 0x87409262A28245BA, 0xC5B073890B687329, 0x4B9237F0FF14C443, 0x0962D61B56FEF2D0, 0xCE73F427ACC0A965, 0x8C8315CC052A9FF6,
        0x3A80143F5CF17F13, 0x7870F5D4F51B4980, 0xBF61D7E80F251235, 0xFD913603A6CF24A6, 0x73B3727A52B393CC, 0x31439391FB59A55F, 0xF652B1AD0167FEEA, 0xB4A25046A88DC879,
        0xA8E6D8B54074A6AD, 0xEA16395EE99E903E, 0x2D071B6213A0CB8B, 0x6FF7FA89BA4AFD18, 0xE1D5BEF04E364A72, 0xA3255F1BE7DC7CE1, 0x64347D271DE22754, 0x26C49CCCB40811C7,
        0x5CBD6CC0CC10FAFC, 0x1E4D8D2B65FACC6F, 0xD95CAF179FC497DA, 0x9BAC4EFC362EA149, 0x158E0A85C2521623, 0x577EEB6E6BB820B0, 0x906FC95291867B05, 0xD29F28B9386C4D96,
        0xCEDBA04AD0952342, 0x8C2B41A1797F15D1, 0x4B3A639D83414E64, 0x09CA82762AAB78F7, 0x87E8C60FDED7CF9D, 0xC51827E4773DF90E, 0x020905D88D03A2BB, 0x40F9E43324E99428,
        0x2CFFE7D5975E55E2, 0x6E0F063E3EB46371, 0xA91E2402C48A38C4, 0xEBEEC5E96D600E57, 0x65CC8190991CB93D, 0x273C607B30F68FAE, 0xE02D4247CAC8D41B, 0xA2DDA3AC6322E288,
        0xBE992B5F8BDB8C5C, 0xFC69CAB42231BACF, 0x3B78E888D80FE17A, 0x7988096371E5D7E9, 0xF7AA4D1A85996083, 0xB55AACF12C735610, 0x724B8ECDD64D0DA5, 0x30BB6F267FA73B36,
        0x4AC29F2A07BFD00D, 0x08327EC1AE55E69E, 0xCF235CFD546BBD2B, 0x8DD3BD16FD818BB8, 0x03F1F96F09FD3CD2, 0x41011884A0170A41, 0x86103AB85A2951F4, 0xC4E0DB53F3C36767,
        0xD8A453A01B3A09B3, 0x9A54B24BB2D03F20, 0x5D45907748EE6495, 0x1FB5719CE1045206, 0x919735E51578E56C, 0xD367D40EBC92D3FF, 0x1476F63246AC884A, 0x568617D9EF46BED9,
        0xE085162AB69D5E3C, 0xA275F7C11F7768AF, 0x6564D5FDE549331A, 0x279434164CA30589, 0xA9B6706FB8DFB2E3, 0xEB46918411358470, 0x2C57B3B8EB0BDFC5, 0x6EA7525342E1E956,
        0x72E3DAA0AA188782, 0x30133B4B03F2B111, 0xF7021977F9CCEAA4, 0xB5F2F89C5026DC37, 0x3BD0BCE5A45A6B5D, 0x79205D0E0DB05DCE, 0xBE317F32F78E067B, 0xFCC19ED95E6430E8,
        0x86B86ED5267CDBD3, 0xC4488F3E8F96ED40, 0x0359AD0275A8B6F5, 0x41A94CE9DC428066, 0xCF8B0890283E370C, 0x8D7BE97B81D4019F, 0x4A6ACB477BEA5A2A, 0x089A2AACD2006CB9,
        0x14DEA25F3AF9026D, 0x562E43B4931334FE, 0x913F6188692D6F4B, 0xD3CF8063C0C759D8, 0x5DEDC41A34BBEEB2, 0x1F1D25F19D51D821, 0xD80C07CD676F8394, 0x9AFCE626CE85B507
        };

        readonly UInt64[] Crc64_Poly000000000000001B_Table64_Reflect = new UInt64[256]
        {
        0x0000000000000000, 0x01B0000000000000, 0x0360000000000000, 0x02D0000000000000, 0x06C0000000000000, 0x0770000000000000, 0x05A0000000000000, 0x0410000000000000,
        0x0D80000000000000, 0x0C30000000000000, 0x0EE0000000000000, 0x0F50000000000000, 0x0B40000000000000, 0x0AF0000000000000, 0x0820000000000000, 0x0990000000000000,
        0x1B00000000000000, 0x1AB0000000000000, 0x1860000000000000, 0x19D0000000000000, 0x1DC0000000000000, 0x1C70000000000000, 0x1EA0000000000000, 0x1F10000000000000,
        0x1680000000000000, 0x1730000000000000, 0x15E0000000000000, 0x1450000000000000, 0x1040000000000000, 0x11F0000000000000, 0x1320000000000000, 0x1290000000000000,
        0x3600000000000000, 0x37B0000000000000, 0x3560000000000000, 0x34D0000000000000, 0x30C0000000000000, 0x3170000000000000, 0x33A0000000000000, 0x3210000000000000,
        0x3B80000000000000, 0x3A30000000000000, 0x38E0000000000000, 0x3950000000000000, 0x3D40000000000000, 0x3CF0000000000000, 0x3E20000000000000, 0x3F90000000000000,
        0x2D00000000000000, 0x2CB0000000000000, 0x2E60000000000000, 0x2FD0000000000000, 0x2BC0000000000000, 0x2A70000000000000, 0x28A0000000000000, 0x2910000000000000,
        0x2080000000000000, 0x2130000000000000, 0x23E0000000000000, 0x2250000000000000, 0x2640000000000000, 0x27F0000000000000, 0x2520000000000000, 0x2490000000000000,
        0x6C00000000000000, 0x6DB0000000000000, 0x6F60000000000000, 0x6ED0000000000000, 0x6AC0000000000000, 0x6B70000000000000, 0x69A0000000000000, 0x6810000000000000,
        0x6180000000000000, 0x6030000000000000, 0x62E0000000000000, 0x6350000000000000, 0x6740000000000000, 0x66F0000000000000, 0x6420000000000000, 0x6590000000000000,
        0x7700000000000000, 0x76B0000000000000, 0x7460000000000000, 0x75D0000000000000, 0x71C0000000000000, 0x7070000000000000, 0x72A0000000000000, 0x7310000000000000,
        0x7A80000000000000, 0x7B30000000000000, 0x79E0000000000000, 0x7850000000000000, 0x7C40000000000000, 0x7DF0000000000000, 0x7F20000000000000, 0x7E90000000000000,
        0x5A00000000000000, 0x5BB0000000000000, 0x5960000000000000, 0x58D0000000000000, 0x5CC0000000000000, 0x5D70000000000000, 0x5FA0000000000000, 0x5E10000000000000,
        0x5780000000000000, 0x5630000000000000, 0x54E0000000000000, 0x5550000000000000, 0x5140000000000000, 0x50F0000000000000, 0x5220000000000000, 0x5390000000000000,
        0x4100000000000000, 0x40B0000000000000, 0x4260000000000000, 0x43D0000000000000, 0x47C0000000000000, 0x4670000000000000, 0x44A0000000000000, 0x4510000000000000,
        0x4C80000000000000, 0x4D30000000000000, 0x4FE0000000000000, 0x4E50000000000000, 0x4A40000000000000, 0x4BF0000000000000, 0x4920000000000000, 0x4890000000000000,
        0xD800000000000000, 0xD9B0000000000000, 0xDB60000000000000, 0xDAD0000000000000, 0xDEC0000000000000, 0xDF70000000000000, 0xDDA0000000000000, 0xDC10000000000000,
        0xD580000000000000, 0xD430000000000000, 0xD6E0000000000000, 0xD750000000000000, 0xD340000000000000, 0xD2F0000000000000, 0xD020000000000000, 0xD190000000000000,
        0xC300000000000000, 0xC2B0000000000000, 0xC060000000000000, 0xC1D0000000000000, 0xC5C0000000000000, 0xC470000000000000, 0xC6A0000000000000, 0xC710000000000000,
        0xCE80000000000000, 0xCF30000000000000, 0xCDE0000000000000, 0xCC50000000000000, 0xC840000000000000, 0xC9F0000000000000, 0xCB20000000000000, 0xCA90000000000000,
        0xEE00000000000000, 0xEFB0000000000000, 0xED60000000000000, 0xECD0000000000000, 0xE8C0000000000000, 0xE970000000000000, 0xEBA0000000000000, 0xEA10000000000000,
        0xE380000000000000, 0xE230000000000000, 0xE0E0000000000000, 0xE150000000000000, 0xE540000000000000, 0xE4F0000000000000, 0xE620000000000000, 0xE790000000000000,
        0xF500000000000000, 0xF4B0000000000000, 0xF660000000000000, 0xF7D0000000000000, 0xF3C0000000000000, 0xF270000000000000, 0xF0A0000000000000, 0xF110000000000000,
        0xF880000000000000, 0xF930000000000000, 0xFBE0000000000000, 0xFA50000000000000, 0xFE40000000000000, 0xFFF0000000000000, 0xFD20000000000000, 0xFC90000000000000,
        0xB400000000000000, 0xB5B0000000000000, 0xB760000000000000, 0xB6D0000000000000, 0xB2C0000000000000, 0xB370000000000000, 0xB1A0000000000000, 0xB010000000000000,
        0xB980000000000000, 0xB830000000000000, 0xBAE0000000000000, 0xBB50000000000000, 0xBF40000000000000, 0xBEF0000000000000, 0xBC20000000000000, 0xBD90000000000000,
        0xAF00000000000000, 0xAEB0000000000000, 0xAC60000000000000, 0xADD0000000000000, 0xA9C0000000000000, 0xA870000000000000, 0xAAA0000000000000, 0xAB10000000000000,
        0xA280000000000000, 0xA330000000000000, 0xA1E0000000000000, 0xA050000000000000, 0xA440000000000000, 0xA5F0000000000000, 0xA720000000000000, 0xA690000000000000,
        0x8200000000000000, 0x83B0000000000000, 0x8160000000000000, 0x80D0000000000000, 0x84C0000000000000, 0x8570000000000000, 0x87A0000000000000, 0x8610000000000000,
        0x8F80000000000000, 0x8E30000000000000, 0x8CE0000000000000, 0x8D50000000000000, 0x8940000000000000, 0x88F0000000000000, 0x8A20000000000000, 0x8B90000000000000,
        0x9900000000000000, 0x98B0000000000000, 0x9A60000000000000, 0x9BD0000000000000, 0x9FC0000000000000, 0x9E70000000000000, 0x9CA0000000000000, 0x9D10000000000000,
        0x9480000000000000, 0x9530000000000000, 0x97E0000000000000, 0x9650000000000000, 0x9240000000000000, 0x93F0000000000000, 0x9120000000000000, 0x9090000000000000
        };

        readonly UInt64[] Crc64_Poly000000000000001B_Table64 = new UInt64[256]
        {
        0x0000000000000000, 0x000000000000001B, 0x0000000000000036, 0x000000000000002D, 0x000000000000006C, 0x0000000000000077, 0x000000000000005A, 0x0000000000000041,
        0x00000000000000D8, 0x00000000000000C3, 0x00000000000000EE, 0x00000000000000F5, 0x00000000000000B4, 0x00000000000000AF, 0x0000000000000082, 0x0000000000000099,
        0x00000000000001B0, 0x00000000000001AB, 0x0000000000000186, 0x000000000000019D, 0x00000000000001DC, 0x00000000000001C7, 0x00000000000001EA, 0x00000000000001F1,
        0x0000000000000168, 0x0000000000000173, 0x000000000000015E, 0x0000000000000145, 0x0000000000000104, 0x000000000000011F, 0x0000000000000132, 0x0000000000000129,
        0x0000000000000360, 0x000000000000037B, 0x0000000000000356, 0x000000000000034D, 0x000000000000030C, 0x0000000000000317, 0x000000000000033A, 0x0000000000000321,
        0x00000000000003B8, 0x00000000000003A3, 0x000000000000038E, 0x0000000000000395, 0x00000000000003D4, 0x00000000000003CF, 0x00000000000003E2, 0x00000000000003F9,
        0x00000000000002D0, 0x00000000000002CB, 0x00000000000002E6, 0x00000000000002FD, 0x00000000000002BC, 0x00000000000002A7, 0x000000000000028A, 0x0000000000000291,
        0x0000000000000208, 0x0000000000000213, 0x000000000000023E, 0x0000000000000225, 0x0000000000000264, 0x000000000000027F, 0x0000000000000252, 0x0000000000000249,
        0x00000000000006C0, 0x00000000000006DB, 0x00000000000006F6, 0x00000000000006ED, 0x00000000000006AC, 0x00000000000006B7, 0x000000000000069A, 0x0000000000000681,
        0x0000000000000618, 0x0000000000000603, 0x000000000000062E, 0x0000000000000635, 0x0000000000000674, 0x000000000000066F, 0x0000000000000642, 0x0000000000000659,
        0x0000000000000770, 0x000000000000076B, 0x0000000000000746, 0x000000000000075D, 0x000000000000071C, 0x0000000000000707, 0x000000000000072A, 0x0000000000000731,
        0x00000000000007A8, 0x00000000000007B3, 0x000000000000079E, 0x0000000000000785, 0x00000000000007C4, 0x00000000000007DF, 0x00000000000007F2, 0x00000000000007E9,
        0x00000000000005A0, 0x00000000000005BB, 0x0000000000000596, 0x000000000000058D, 0x00000000000005CC, 0x00000000000005D7, 0x00000000000005FA, 0x00000000000005E1,
        0x0000000000000578, 0x0000000000000563, 0x000000000000054E, 0x0000000000000555, 0x0000000000000514, 0x000000000000050F, 0x0000000000000522, 0x0000000000000539,
        0x0000000000000410, 0x000000000000040B, 0x0000000000000426, 0x000000000000043D, 0x000000000000047C, 0x0000000000000467, 0x000000000000044A, 0x0000000000000451,
        0x00000000000004C8, 0x00000000000004D3, 0x00000000000004FE, 0x00000000000004E5, 0x00000000000004A4, 0x00000000000004BF, 0x0000000000000492, 0x0000000000000489,
        0x0000000000000D80, 0x0000000000000D9B, 0x0000000000000DB6, 0x0000000000000DAD, 0x0000000000000DEC, 0x0000000000000DF7, 0x0000000000000DDA, 0x0000000000000DC1,
        0x0000000000000D58, 0x0000000000000D43, 0x0000000000000D6E, 0x0000000000000D75, 0x0000000000000D34, 0x0000000000000D2F, 0x0000000000000D02, 0x0000000000000D19,
        0x0000000000000C30, 0x0000000000000C2B, 0x0000000000000C06, 0x0000000000000C1D, 0x0000000000000C5C, 0x0000000000000C47, 0x0000000000000C6A, 0x0000000000000C71,
        0x0000000000000CE8, 0x0000000000000CF3, 0x0000000000000CDE, 0x0000000000000CC5, 0x0000000000000C84, 0x0000000000000C9F, 0x0000000000000CB2, 0x0000000000000CA9,
        0x0000000000000EE0, 0x0000000000000EFB, 0x0000000000000ED6, 0x0000000000000ECD, 0x0000000000000E8C, 0x0000000000000E97, 0x0000000000000EBA, 0x0000000000000EA1,
        0x0000000000000E38, 0x0000000000000E23, 0x0000000000000E0E, 0x0000000000000E15, 0x0000000000000E54, 0x0000000000000E4F, 0x0000000000000E62, 0x0000000000000E79,
        0x0000000000000F50, 0x0000000000000F4B, 0x0000000000000F66, 0x0000000000000F7D, 0x0000000000000F3C, 0x0000000000000F27, 0x0000000000000F0A, 0x0000000000000F11,
        0x0000000000000F88, 0x0000000000000F93, 0x0000000000000FBE, 0x0000000000000FA5, 0x0000000000000FE4, 0x0000000000000FFF, 0x0000000000000FD2, 0x0000000000000FC9,
        0x0000000000000B40, 0x0000000000000B5B, 0x0000000000000B76, 0x0000000000000B6D, 0x0000000000000B2C, 0x0000000000000B37, 0x0000000000000B1A, 0x0000000000000B01,
        0x0000000000000B98, 0x0000000000000B83, 0x0000000000000BAE, 0x0000000000000BB5, 0x0000000000000BF4, 0x0000000000000BEF, 0x0000000000000BC2, 0x0000000000000BD9,
        0x0000000000000AF0, 0x0000000000000AEB, 0x0000000000000AC6, 0x0000000000000ADD, 0x0000000000000A9C, 0x0000000000000A87, 0x0000000000000AAA, 0x0000000000000AB1,
        0x0000000000000A28, 0x0000000000000A33, 0x0000000000000A1E, 0x0000000000000A05, 0x0000000000000A44, 0x0000000000000A5F, 0x0000000000000A72, 0x0000000000000A69,
        0x0000000000000820, 0x000000000000083B, 0x0000000000000816, 0x000000000000080D, 0x000000000000084C, 0x0000000000000857, 0x000000000000087A, 0x0000000000000861,
        0x00000000000008F8, 0x00000000000008E3, 0x00000000000008CE, 0x00000000000008D5, 0x0000000000000894, 0x000000000000088F, 0x00000000000008A2, 0x00000000000008B9,
        0x0000000000000990, 0x000000000000098B, 0x00000000000009A6, 0x00000000000009BD, 0x00000000000009FC, 0x00000000000009E7, 0x00000000000009CA, 0x00000000000009D1,
        0x0000000000000948, 0x0000000000000953, 0x000000000000097E, 0x0000000000000965, 0x0000000000000924, 0x000000000000093F, 0x0000000000000912, 0x0000000000000909
        };
        #endregion 

        public UInt64 CRC64_Calculate(Scm_CRC64_InputParameters scm_CRC64_InputParameters)
        {
            UInt64 poly = scm_CRC64_InputParameters.Polynomial;
            UInt64 crc = scm_CRC64_InputParameters.InitCrc;
            int width = scm_CRC64_InputParameters.cWidth;

            //小端模式,反轉多項式
            if (scm_CRC64_InputParameters.LittleEndian)
                poly = SpecialFunctions.ReverseBits.ReverseUInt64(poly);

            for (int i = 0; i < scm_CRC64_InputParameters.Datas.Length; i++)
            {
                byte tempData = scm_CRC64_InputParameters.Datas[i];
                //輸入反轉
                if (scm_CRC64_InputParameters.RefIn)
                    tempData = SpecialFunctions.ReverseBits.ReverseUInt8(tempData);

                if (scm_CRC64_InputParameters.LittleEndian)
                    crc ^= (UInt64)((UInt64)tempData & 0xff);
                else
                    //左移到最高位元組,然後與初始值異或
                    crc ^= (UInt64)((UInt64)tempData << (width - 8));


                for (int j = 0; j < 8; j++)
                {
                    if (scm_CRC64_InputParameters.LittleEndian)
                    {//小端模式
                        //最低位為1,異或多項式
                        if ((crc & 0x01) != 0)
                        {
                            crc >>= 1;
                            crc ^= poly;
                        }
                        else
                            crc >>= 1;

                    }
                    else
                    {
                        //最高位為1,異或多項式
                        if ((crc & ((UInt64)1 << (width - 1))) != 0)
                        {
                            crc <<= 1;
                            crc ^= poly;
                        }
                        else
                            crc <<= 1;
                    }
                }

            }

            //輸出反轉
            if (scm_CRC64_InputParameters.RefOut)
                crc = SpecialFunctions.ReverseBits.ReverseUInt64(crc);

            //輸出異或
            //if (scm_CRC64_InputParameters.isOutputXor)
            crc ^= scm_CRC64_InputParameters.XorOut;

            return crc;

        }

        public UInt64[] GetCRC64_ByteTable(UInt64 poly, bool LittleEndian)
        {
            Scm_CRC64_InputParameters scm_CRC64_InputParameters = new Scm_CRC64_InputParameters()
            { LittleEndian = LittleEndian, Polynomial = poly, InitCrc = 0x0000000000000000, RefIn = false, RefOut = false, XorOut = 0x0000000000000000 };

            UInt64[] table = new UInt64[256];
            for (int i = 0; i < 256; i++)
            {
                scm_CRC64_InputParameters.Datas = new byte[1] { (byte)i };
                table[i] = CRC64_Calculate(scm_CRC64_InputParameters);
            }
            return table;
        }

        /// <summary>
        /// CRC64
        /// 位元組查表法
        /// </summary>
        UInt64 CRC64_CalCrcByByte(Scm_CRC64_InputParameters scm_CRC64_InputParameters)
        {


            UInt64 poly = scm_CRC64_InputParameters.Polynomial;
            UInt64 crc = scm_CRC64_InputParameters.InitCrc;
            int width = scm_CRC64_InputParameters.cWidth;

            //小端模式,反轉多項式
            if (scm_CRC64_InputParameters.LittleEndian)
                poly = SpecialFunctions.ReverseBits.ReverseUInt64(poly);

            for (int i = 0; i < scm_CRC64_InputParameters.Datas.Length; i++)
            {
                byte tempData = scm_CRC64_InputParameters.Datas[i];
                //輸入反轉
                if (scm_CRC64_InputParameters.RefIn)
                    tempData = SpecialFunctions.ReverseBits.ReverseUInt8(tempData);

                byte index = 0;
                //異或的部分最終會消除掉,這裡我們就不将其存到CRC了
                if (scm_CRC64_InputParameters.LittleEndian)
                    //最低位元組與初始值異或
                    index = (byte)(crc ^ tempData);
                else
                    //左移到最高位元組,然後與初始值異或
                    index = (byte)((crc >> (width - 8)) ^ tempData);


                switch (poly)
                {
                    case 0x42F0E1EBA9EA3693:
                        if (scm_CRC64_InputParameters.LittleEndian)
                            crc = (UInt64)(((UInt64)crc >> 8) ^ Crc64_Poly42F0E1EBA9EA3693_Table64_Reflect[index]);
                        else
                            crc = (UInt64)(((UInt64)crc << 8) ^ Crc64_Poly42F0E1EBA9EA3693_Table64[index]);
                        break;

                    case 0x000000000000001B:
                        if (scm_CRC64_InputParameters.LittleEndian)
                            crc = (UInt64)(((UInt64)crc >> 8) ^ Crc64_Poly000000000000001B_Table64_Reflect[index]);
                        else
                            crc = (UInt64)(((UInt64)crc << 8) ^ Crc64_Poly000000000000001B_Table64[index]);
                        break;


                    default:

                        crc = 0;
                        break;
                }

            }

            //輸出反轉
            if (scm_CRC64_InputParameters.RefOut)
                crc = SpecialFunctions.ReverseBits.ReverseUInt64(crc);

            //輸出異或
            //if (scm_CRC64_InputParameters.isOutputXor)
            crc ^= scm_CRC64_InputParameters.XorOut;

            return crc;

        }

        private void CalCrc64All(byte[] data)
        {
            //網址2:https://emn178.github.io/online-tools/crc64.html
            //http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

            Scm_CRC64_InputParameters[] scm_CRC64_InputParametersList = new Scm_CRC64_InputParameters[] {
                new Scm_CRC64_InputParameters(){ AlgorithmName ="CRC-64_ECMA_182", Polynomial=0x42F0E1EBA9EA3693, InitCrc=0x0000000000000000, RefIn=false, RefOut=false, XorOut=0x0000000000000000, Datas=SpecialFunctions.ArrayCopy.CopyArray<byte>(data)},
                new Scm_CRC64_InputParameters(){ AlgorithmName ="CRC-64_GO_ISO  ", Polynomial=0x000000000000001B, InitCrc=0xFFFFFFFFFFFFFFFF, RefIn=true,  RefOut=true,  XorOut=0xFFFFFFFFFFFFFFFF, Datas=SpecialFunctions.ArrayCopy.CopyArray<byte>(data)},
                new Scm_CRC64_InputParameters(){ AlgorithmName ="CRC-64_WE      ", Polynomial=0x42F0E1EBA9EA3693, InitCrc=0xFFFFFFFFFFFFFFFF, RefIn=false, RefOut=false, XorOut=0xFFFFFFFFFFFFFFFF, Datas=SpecialFunctions.ArrayCopy.CopyArray<byte>(data)},
                new Scm_CRC64_InputParameters(){ AlgorithmName ="CRC-64_XZ      ", Polynomial=0x42F0E1EBA9EA3693, InitCrc=0xFFFFFFFFFFFFFFFF, RefIn=true,  RefOut=true,  XorOut=0xFFFFFFFFFFFFFFFF, Datas=SpecialFunctions.ArrayCopy.CopyArray<byte>(data)},

            };

            for (int i = 0; i < scm_CRC64_InputParametersList.Length; i++)
            {
                //scm_CRC64_InputParametersList[i].Datas = SpecialFunctions.ArrayCopy.CopyArray<byte>(data);
                UInt64 crc1 = CRC64_Calculate(scm_CRC64_InputParametersList[i]);

                Console.WriteLine("BitsCal {0}, Poly={1:X016}, InitCrc={2:X016}, RefIn={3}, RefOut={4}, XorOut={5:X016}, data={6}, result={7:X016}",
                    scm_CRC64_InputParametersList[i].AlgorithmName,
                    scm_CRC64_InputParametersList[i].Polynomial, scm_CRC64_InputParametersList[i].InitCrc,
                    (scm_CRC64_InputParametersList[i].RefIn ? "True " : "False"), (scm_CRC64_InputParametersList[i].RefOut ? "True " : "False"),
                    scm_CRC64_InputParametersList[i].XorOut, BitConverter.ToString(scm_CRC64_InputParametersList[i].Datas).Replace("-", ""),
                    crc1);

                UInt64 crc2 = CRC64_CalCrcByByte(scm_CRC64_InputParametersList[i]);

                Console.WriteLine("ByteCal {0}, Poly={1:X016}, InitCrc={2:X016}, RefIn={3}, RefOut={4}, XorOut={5:X016}, data={6}, result={7:X016}",
                    scm_CRC64_InputParametersList[i].AlgorithmName,
                    scm_CRC64_InputParametersList[i].Polynomial, scm_CRC64_InputParametersList[i].InitCrc,
                    (scm_CRC64_InputParametersList[i].RefIn ? "True " : "False"), (scm_CRC64_InputParametersList[i].RefOut ? "True " : "False"),
                    scm_CRC64_InputParametersList[i].XorOut, BitConverter.ToString(scm_CRC64_InputParametersList[i].Datas).Replace("-", ""),
                    crc2);

                if (crc1 != crc2)
                {
                    ConsoleColor temp = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Not Same");
                    Console.ForegroundColor = temp;
                }
            }
        }

        private void GetTableTest()
        {
            UInt64[] polyList = new UInt64[] { 0x42F0E1EBA9EA3693, 0x000000000000001B };

            for (int pp = 0; pp < polyList.Length; pp++)
            {
                bool[] littleEndian = new bool[] { true, false };

                for (int ss = 0; ss < littleEndian.Length; ss++)
                {
                    Console.Write("readonly UInt64[] Crc64_Poly" + polyList[pp].ToString("X016") + "_Table64" + (littleEndian[ss] ? "_Reflect" : "") + " = new UInt64[256]\r\n{");
                    UInt64[] table = GetCRC64_ByteTable(polyList[pp], littleEndian[ss]);
                    //UInt64[] table = GetCRC64_ByteTable_1((uint)(polyList[pp] + (1 << 16)));
                    for (int i = 0; i < table.Length; i++)
                    {
                        if (i % 8 == 0)
                        {
                            Console.WriteLine();
                            Console.Write("\t");
                        }


                        if (i < table.Length - 1)
                            Console.Write("0x{0:X016}, ", table[i]);
                        else
                        {
                            Console.Write("0x{0:X016}\r\n", table[i]);
                            Console.WriteLine(@"};");
                            Console.WriteLine();
                        }


                    }
                }
            }
            Console.WriteLine();

        }



        public static void Test(byte[] data, UInt64 crcInitial)
        {
            CRC64 cRC64 = new CRC64();

            cRC64.CalCrc64All(data);
            //cRC64.GetTableTest();

        }
    }
}
           

上一篇 【CRC】CRC推導(七)CRC32的各種實作

繼續閱讀