You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
| #include "common.h"
 | |
| #include <QTextStream>
 | |
| #include <QDebug>
 | |
| 
 | |
| #define CRC32_CHAR_BIT 8
 | |
| static uint32_t crc32Table[256];
 | |
| 
 | |
| 
 | |
| uint32_t crc32_reflect(uint32_t value, uint8_t bits)
 | |
| {
 | |
|     uint32_t reflection = 0;
 | |
| 
 | |
|     for(uint8_t i = 0; i < bits ; i++)
 | |
|     {
 | |
|         if (value & (1u << i))
 | |
|             reflection |= 1 << (bits - 1 - i);
 | |
|     }
 | |
| 
 | |
|     return reflection;
 | |
| }
 | |
| 
 | |
| /* crc32 初始化. */
 | |
| void crc32_table_init(void)
 | |
| {
 | |
|     uint32_t int1 = 1;
 | |
|     uint32_t const value_high_bit = int1 << 31u;
 | |
|     uint8_t dividend = 0;
 | |
| 
 | |
|     do
 | |
|     {
 | |
|         uint32_t remainder = 0;
 | |
|         for(uint8_t mask = 1u << (CRC32_CHAR_BIT - 1u); mask; mask >>= 1)
 | |
|         {
 | |
|             if (dividend & mask)
 | |
|                 remainder ^= value_high_bit;
 | |
| 
 | |
|             if (remainder & value_high_bit)
 | |
|             {
 | |
|                 remainder <<= 1;
 | |
|                 remainder ^= 0x04C11DB7u;
 | |
|             }
 | |
|             else
 | |
|                 remainder <<= 1;
 | |
|         }
 | |
| 
 | |
|         crc32Table[crc32_reflect(dividend, CRC32_CHAR_BIT)] = crc32_reflect(remainder, 32);
 | |
|     }
 | |
|     while(++dividend);
 | |
| }
 | |
| 
 | |
| 
 | |
| uint32_t crc32(void const *buf, uint32_t byte_count)
 | |
| {
 | |
|     uint32_t rem = 0xFFFFFFFF;
 | |
|     uint8_t const * const b_begin = (uint8_t*)buf;
 | |
|     uint8_t const * const b_end = b_begin + byte_count;
 | |
| 
 | |
|     for(uint8_t const *p = b_begin; p < b_end; p++)
 | |
|     {
 | |
|         uint8_t const byte_index = *p ^ rem;
 | |
|         rem >>= CRC32_CHAR_BIT;
 | |
|         rem ^= crc32Table[ byte_index ];
 | |
|         //char *nptr = (char *)&rem;
 | |
|         //printHexArray(nptr, 4);
 | |
|     }
 | |
|     return ~rem;
 | |
| }
 | |
| 
 | |
| int32_t stringToChar(QString str, char *buf, uint32_t len)
 | |
| {
 | |
|     if (nullptr == buf)
 | |
|     {
 | |
|         return -1;
 | |
|     }
 | |
| 
 | |
|     QByteArray ba = str.toLatin1();
 | |
| 
 | |
|     if (ba.length() <= 0
 | |
|         || ba.length() >= len)
 | |
|     {
 | |
|         return -2;
 | |
|     }
 | |
| 
 | |
|     memset(buf, 0, len);
 | |
|     memcpy(buf, ba.data(), ba.length());
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| void printHexArray(const char *msg, const char *array, int length)
 | |
| {
 | |
|     QTextStream out(stdout);
 | |
|     out << msg << "###printHexArray" << "(len:" << length << ")\n";
 | |
|     for (int i = 0; i < length; ++i)
 | |
|     {
 | |
|         out << QString::number(static_cast<unsigned char>(array[i]), 16)
 | |
|             .toUpper().rightJustified(2, '0'); // 转换为16进制并且前面补0
 | |
|         if (i < length - 1)
 | |
|         {
 | |
|             out << " "; // 每个元素之间加空格
 | |
|         }
 | |
| 
 | |
|         if ((i+1) % 16 == 0)
 | |
|             out << "\n"; // 换行
 | |
|     }
 | |
|     out << "\n"; // 换行
 | |
| }
 | |
| 
 | |
| 
 |