Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays C-将64个字符的数组强制转换为16个无符号整数的数组_Arrays_C_Casting - Fatal编程技术网

Arrays C-将64个字符的数组强制转换为16个无符号整数的数组

Arrays C-将64个字符的数组强制转换为16个无符号整数的数组,arrays,c,casting,Arrays,C,Casting,我目前正在从事一个项目,该项目最终将实现hmac-sha1系统。现在我离项目的开始已经很近了,所以我正在努力让我的sha1函数彼此配合得很好。我目前遇到的问题是调用处理sha1迭代的函数 我有一个函数,它接受一个无符号字符数组,以及sha1的状态变量,然后在for循环中,它将字符数组(转换为16字节无符号整数数组)发送给交互函数,总共80次 void sha1Block( unsigned char data[ 64 ], SHA1State *state ) for (int i = 0; i

我目前正在从事一个项目,该项目最终将实现hmac-sha1系统。现在我离项目的开始已经很近了,所以我正在努力让我的sha1函数彼此配合得很好。我目前遇到的问题是调用处理sha1迭代的函数

我有一个函数,它接受一个无符号字符数组,以及sha1的状态变量,然后在for循环中,它将字符数组(转换为16字节无符号整数数组)发送给交互函数,总共80次

void sha1Block( unsigned char data[ 64 ], SHA1State *state )
for (int i = 0; i < 80; i++) {
        sha1Iteration(*((unsigned int *)data), &a, &b, &c, &d, &e, i); // This is my issue
    }

到目前为止,我已经设法让这个函数或多或少地工作到不会抛出错误的程度,所以我真的需要一些帮助,弄清楚如何将由64个无符号字符组成的数组转换为由16个无符号整数组成的数组

但不幸的是,可能将任意字符指针强制转换为C中的
无符号int
指针,原因有两个:它将违反两条规则:对齐和严格别名。虽然它可以在某些编译器和调试版本中工作,但在启用优化()时,它很可能会严重损坏

因此,您需要仔细实施它,以便

  • 如果机器端度对于算法是正确的

    • memcpy
      每4个字节分别设置为
      unsigned int
      uint32\u t
      值,或
    • memcpy
      整个缓冲区到
      uint32\u t
      s的数组
  • 或者使用位移位和or从连续字节构造
    uint32\u t
    s,例如

    uint32_t value = (uint32_t)data[0]       | (uint32_t)data[1] << 8 | 
                     (uint32_t)data[2] << 16 | (uint32_t)data[3] << 24;
    

    uint32_t value=(uint32_t)数据[0]|(uint32_t)数据[1]如何执行此操作将取决于
    sha1Iteration
    如何使用数据。你能编辑你的帖子并添加整个
    sha1Iteration
    函数吗?嗨,所以我基本上(?)理解你的意思,虽然我从来没有讨论过uint32\t的使用,但据我所知,它们存储有保证的32位,但由于我需要转换一个64字节的字符数组,所以在一个数组中总共需要16个字符。但是我需要将uint32_t value[16]的数组(?)转换成无符号整数数组,这是我的sha1Iteration函数所需要的(我不能改变这个)@JoshAvery无符号整数不能保证包含32位,它可以是任何东西
    uint32_t
    保证了精确的32位表示,这就是您应该用于此类算法的原因。如果确实无法更改
    sha1Iteration
    函数,则必须将整个数组复制到
    uint32\u t
    数组中,因此,进行循环,以提高uint32\u t数组和字符数组的索引,并对16项中的每项进行位移复制。@JoshAvery更准确地说,由于
    unsigned int
    可以是16位以上的任何值,并且此算法需要(精确地)32位整数,因此请使用“uint32\u t”。
    sha1Iteration((unsigned int *)data, ...
    
    uint32_t value = (uint32_t)data[0]       | (uint32_t)data[1] << 8 | 
                     (uint32_t)data[2] << 16 | (uint32_t)data[3] << 24;