将字符数组转换为c--中的uint32_t数组是正确的方法吗?

时间:2017-04-15 02:13:28

标签: c string type-conversion int unsigned

我正在尝试将字符数组转换为uint32_t数组,以便在CRC计算中使用它。我很好奇这是否是正确的方法,或者它是否危险?我有做危险转换的习惯,我正在努力学习更好的方法来转换那些不那么危险的东西:)。我知道数组中的每个字符都是8位。我应该将4个字符加起来并将其放入unsigned int数组的索引中,还是将每个字符放在单独的数组中?总结四个8位字符会将它们的值更改为数组吗?我已经阅读了有关移位字符的内容,但是,我不确定如何将四个字符转换为unsigned int数组的一个索引。

text [i]是我的角色数组。

uint32_t inputText[512];
for( i = 0; i < 504; i++)
{
  inputText[i] = (uint32_t)text[i];
}

1 个答案:

答案 0 :(得分:1)

演员看起来很好;但是,当你的i < 504数组为512时,我不确定为什么你说uint32_t。(如果你只想转换504个值而你想要一个512长度的数组,那么你可能想要使用array[512] = {0}来确保内存被清零,而不是将最后8个值设置为以前在内存中的任何值。)尽管如此,它是完全安全的:SomeArrayOfLargerType[i] = (largerType_t)SomeArrayOfSmallerType[i],但是熊记住它现在是怎样的,你的二进制文件最终会看起来像:

 0100 0001 -> 0000 0000 0000 0000 0000 0000 0100 0001

因此,那些24个领先的0可能是不受欢迎的结果。

至于总结四个角色,这几乎肯定不能解决你想要的问题;除非你真的想要0000 0001(一)+ 0000 0010(二)= 0000 0100(三)这样的总和。如果您希望前面的示例生成00000001 000000010,那么是的,您需要应用轮班。

更新 - 有关通过示例进行转移的一些信息:

以下是转移的一个例子:

uint32_t valueArray[FINAL_LENGTH] = {0};
int i;
for(i=0; i < TEXT_LENGTH; i++){ // text_length is the initial message/text length (512 bytes or something)
    int mode = i % 4; // 4-to-1 value storage ratio (4 uint8s being stored as 1 uint32)
    int writeLocation = (int)(i/4); // values will be truncated, so something like 3/4 = 0 (which is desired)
    switch(mode){
        case(0):
            // add to bottom 8-bits of index
            valueArray[writeLocation] = text[i];
            break;
        case(1):
            valueArray[writeLocation] |= (text[i] << 8); // shift to left by 8 bits to insert to second byte
            break;
        case(2):
            valueArray[writeLocation] |= (text[i] << 16); // shift to left by 16 bits to insert to third byte
            break;
        case(3):
            valueArray[writeLocation] |= (text[i] << 24); // shift to left by 24 bits to insert to fourth byte
            break;
        default:
            printf("Some error occurred here... If source has been modified, please check to make sure the number of case handlers == the possible values for mode.\n");
    }
}

你可以看到一个在这里运行的例子:https://ideone.com/OcDMoM注意,在IDEOne上执行时会出现一些运行时错误。但是,我并没有对这个问题表现出强烈的看法,输出似乎仍然准确,代码只是作为一个例子。

基本上,因为每个字节都是8位,并且您希望以4字节块(每个32位)存储字节,所以您需要四种不同的情况来确定您的移位距离。在第一种情况下,前8位由消息中的一个字节填充。在第二种情况下,第二个8位由消息中的后续字节填充(左移8位,因为这是二进制位置的偏移)。剩下的2个字节继续,然后从初始消息数组的下一个索引开始重复。

当组合字节时,使用|=因为它将采用uint32中已有的内容并且它将对其执行按位OR,因此最终值将合并为一个单独的值。

所以,为了打破一个简单的例子,就像我在最初的帖子中所做的那样,让我们​​说我有0000 0001(一个)和0000 0010(两个),最初的16个-bit整数来保存它们0000 0000 0000 0000。第一个字节分配给16位整数,使其成为0000 0000 0000 0001。然后第二个字节左移8,使其成为0000 0010 0000 0000。最后,这两个是通过按位OR,因此16位整数变为:0000 0010 0000 0001

如果32位整数保持4个字节,则该过程将再重复2次,另外8次移位,然后它将继续执行下一个uint32以重复该过程。

希望一切都有道理。如果没有,我可以尝试进一步澄清。