欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

同样是格雷码

同样是格雷码

偶也来献丑,同样是格雷码。

代码:

#define CODE_LENGTH     9
#define TABLE_SIZE      ((1 << CODE_LENGTH) - 1)
unsigned int table[TABLE_SIZE] = {
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 8,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 9,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 8,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
    1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1
};
char    name[32];
char    serial[TABLE_SIZE + 1];
unsigned int calc_name
    (
    char            name[32],
    unsigned int    code[CODE_LENGTH]
    )
    {
    int name_length = strlen(name);
    int factor = 0x13572468;
    int tmp1, tmp2;
    unsigned char c;
    int i;
    for (i = 0; i < name_length; i++)
        {
        tmp1 = name[i];
        tmp1 += factor;
        tmp1 *= 0x03721273;
        tmp1 += 0x24681357;
        tmp2 = tmp1;
        tmp2 <<= 0x19;
        tmp1 >>= 0x07;
        tmp2 |= tmp1;
        factor = tmp2;
        }
    for (i = 1; i < CODE_LENGTH; i++)
        {
        tmp1= factor;
        tmp1 = tmp1 >> i;
        c = (unsigned char)tmp1;
        c &= 0x01;
        code[i - 1] = c;
        }
    code[8] = 1;
    return (unsigned int)factor;
    }
void calc_code1
    (
    int *   a,
    int *   b
    )
    {
    int i = CODE_LENGTH;
    a += (CODE_LENGTH - 1);
    b += (CODE_LENGTH - 1);
    *b = *a;
    for (i--; i > 0; i--, a--, b--)
        {
        *(b - 1) = (*b) ^ (*(a - 1));
        }
    }
int calc_code2
    (
    int *   a
    )
    {
    int v = 0;
    int i;
    i = CODE_LENGTH;
    a += (CODE_LENGTH - 1);
    for (; i > 0; i--, a--)
        {
        v = (v << 1) + (*a);
        }
    return v;
    }
int calc(char input[32])
    {
    int serial_length = 0;
    unsigned int name_int = 0;
    unsigned int name_code[CODE_LENGTH] = {0};
    int tmp[CODE_LENGTH] = {0};
    int i;
    name_int = calc_name(input, name_code);
    calc_code1(name_code, tmp);
    serial_length = calc_code2(tmp);
    for (i = 0; i < serial_length; i++)
        {
        serial[i] = table[serial_length - i - 1] - ((name_int >> (i % 31)) % 10);
        if (serial[i] < 0)
            serial[i] += 10;
        serial[i] += 0x30;
        }
    return 0;
    }

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功