C 将 20 位字符串转换为数字以进行 IBAN 验证

Posted

技术标签:

【中文标题】C 将 20 位字符串转换为数字以进行 IBAN 验证【英文标题】:C converting 20 digit string to number for IBAN validation 【发布时间】:2021-05-24 10:26:47 【问题描述】:

我正在用 C 语言进行 IBAN 验证。为此,我有一个类似于“2012129431327715102998”的字符*。 现在我想通过取值模 97 来检查 IBAN。 所以我想做2012129431327715102998 % 97。 我已经尝试使用 strtoull 转换 char* ,但这给了我一个超出范围的错误。所以我的问题是:如何将此 char* 转换为可以进行模计算的数字?提前致谢

【问题讨论】:

en.wikipedia.org/wiki/… 你需要 C 的 int256 库。对于 c++,我知道一个。我想可能是面包钱包里有一个。看看上面的加密货币 实施除法,你在学校学的那个。 【参考方案1】:

您可以为此编写自定义函数。对部分和应用模运算符,可以转换任意长度的数:

#include <stdio.h>

int mod97(const char *s) 
    int res = 0;
    while (*s >= '0' && *s <= '9') 
        res = (res * 10 + (*s++ - '0')) % 97;
    
    return res;


int main(int argc, char *argv[]) 
    for (int i = 1; i < argc; i++) 
         printf("%s -> %d\n", argv[i], mod97(argv[i]));
    
    return 0;

输出:

./mod97 2012129431327715102998
2012129431327715102998 -> 53

这种方法比wiki文章中描述的更简单,更通用:计算一个大数的模97可以通过将数字分成9位数的块并组合这些块的模来实现。这种拆分特定于97,并且因为1000000000 % 97 == 1 而起作用。上述方法适用于最大为INT_MAX / 10 的任何模值。

【讨论】:

【参考方案2】:

不使用额外库的简单方法是记住 数学上的mod(a*b, c) == mod(b * mod(a, c), c)。所以你可以处理chunks中的数字:

// suitable for a 32 bits system, can use 8 for a 64 bits one
#define NB 4
/*********************
 * Initial is a string containin only digits representing an arbitrary large number
 * div in a number < 10000 (because NB is 4)
 * ******************/
int large_mod(char *initial, int div) 
    char old[1 + (NB * 2)] = "";   // enough room for a remainder and next chunk
    long val;
    for (unsigned i=0; i<strlen(initial); i+= NB) 
        strncat(old, initial + i, NB);   // add the new chunk
        val = atol(old) % div;           // compute the remainder
        sprintf(old, "%ld", val);        // keep it for next chunk
        // printf("%ld ", val);          // uncomment for debugging
    
    return (int) val;

对于 2012129431327715102998 % 97,它给出了预期的 53。

【讨论】:

非常感谢!它有效,但下面的答案更容易理解!

以上是关于C 将 20 位字符串转换为数字以进行 IBAN 验证的主要内容,如果未能解决你的问题,请参考以下文章

计算并检查 IBAN [重复]

IBAN 验证检查

如何将两个数组与每个元素相乘作为数字c ++

将代码从5位转换为3位字符

js怎么把20位数字字符串转换成数字,在线等

C语言,将一个整数转化为字符串再与另一字符串连接。(用指针)