2017-04-15 22 views
0

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

text [i]是我的字符数组。

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

回答

1

演员似乎很好;虽然,我不知道为什么当你的数组uint32_t s是512时说你的i < 504。(如果你确实想要只转换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,那么是的,您需要应用班次。

UPDATE - 关于通过例如将一些信息:

下会转变的一个例子:

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中的内容,并且它将对其执行按位或运算,因此最终值将合并为一个单一值。

因此,要打破一个简单的例子,像什么,我在我的初始后,让我们说我有0000 0001(一个)和0000 0010(二),最初的16位整数追究他们0000 0000 0000 0000。第一个字节分配给16位整数使其成为0000 0000 0000 0001。然后第二个字节左移8,使其成为0000 0010 0000 0000。最后,这两个是通过按位或,所以16位整数变成:0000 0010 0000 0001

在一个32位整数保存4个字节的情况下,该过程将重复2次多8次额外的移位,然后进入下一个uint32重复该过程。

希望大家都有道理。如果不是,我可以尝试进一步澄清。

+0

我显然确实需要使用班次以使CRC符合老师的答案。他告诉我尝试使用4个16位块来计算每64位线的CRC。但是,unsigned int必须是32位。我假设我需要将字符转移到数组中以将其转换为32位来创建块。另外,我觉得未来会有很好的知识。你介意帮助我吗? – starlight

+0

@starlight,个人而言,我从来没有看过CRC校验和的实现,所以我不能给你一个确切的答案,说明如何解决这个问题(这可能更好,因为整个课程的目的是弄清楚独立完成这些事情)。但是,我会给你一个如何做到这一转变的一般例子。给我几分钟更新答案。 – SpencerD

+0

谢谢,我应该能够从那里去! :) – starlight

相关问题