为什么“长数据类型数组具有十六进制值?

How come a "long-datatype array has hexadecimal values?

我正在尝试使用 Tiny Encryption Algorithm,但问题是: 我不明白为什么数组是 long 类型并且它有十六进制值,例如

unsigned long v[] = {0xe15034c8, 0x260fd6d5};

另外,我想传递一个从流中读取的纯文本(ASCII),我应该以什么数据格式将它传递给这种类型的数组?

加密函数为:

void encipher(unsigned long *const v,unsigned long *const w,
              const unsigned long *const k)
{
    register unsigned long       y=v[0],z=v[1],sum=0,delta=0x9E3779B9,
                a=k[0],b=k[1],c=k[2],d=k[3],n=32;

    while(n-->0)
    {
        sum += delta;
        y += (z << 4)+a ^ z+sum ^ (z >> 5)+b;
        z += (y << 4)+c ^ y+sum ^ (y >> 5)+d;
    }

    w[0]=y; w[1]=z;
}

它有 long 因为 0xe15034c8 在 base-10 中是 3780129992。在某些平台上 int 太小而无法处理这么大的数字。此外,与十进制表示相比,十六进制表示通常具有更少的数字并且在代码中消耗更少 space 。 Here据说int32的最大值是2,147,483,647。您的第一个数字 (3,780,129,992) 较大 而第二个 (638,572,245) 较小。

unsigned long 在大多数平台上将大于 4 个字节。 所以你在这个数组中存储了一个 32 位的值,这完全没问题。

你可以做一个 sizeof(unsigned long) 看看 unsigned long 的大小是多少,并计算它可以容纳的最大值是多少。

Also, I want to pass a plaintext (ASCII) read from stream, in what data format should I pass it to this type of array?

假设您想要将输入读取为字符串并将值存储在此数组中,那么您可以使用 API 之类的 atoi()

这是一个常见的混淆。十六进制不是一种数据类型,它是一种表示形式。例如,"table" 在其他口语中可能有不同的称呼(即西班牙语中的 "mesa"),但它仍然是 table。在这种情况下,值(例如 10)可以用不同的方式表示,对我们人类来说最常见的是以 10 为底数。但是计算机使用二进制(和其他相关的表示形式,如十六进制),因此对我们来说是 10,对计算机来说它是是 1010(十六进制的 A)。最后,long 只是一个 32 位的值,你想如何表示它取决于你,但值是相同的。

对于字符,对于计算机来说它们仍然是数字,因此您可以将它们的值作为长整数块传递(即使用 atoi()

整数常量可以用八进制、十进制或十六进制表示。以下几行是等效的,并将 a 初始化为 10.

int a = 012;
int a = 10;
int a = 0xA;

在你的情况下,

unsigned long v[] = {0xe15034c8, 0x260fd6d5};

相当于:

unsigned long v[] = {3780129992, 638572245};

关于

I want to pass a plaintext (ASCII) read from stream, in what data format should I pass it to this type of array?

您需要使用标准库中的几个函数之一来解析字符串的内容,例如 sscanfatoistrtol,并将结果赋值v.

的元素的编号