2017-04-15 23 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

相關問題