2014-03-07 33 views
1

這似乎是一個基本的問題,但我找不到任何地方的答案。如何在C中存儲字節數組?

我知道C/C++沒有byte數據類型。 我知道sizeof(char) == 1

我試圖存儲12個傳輸,每個96個字節在卵石上,從我的Android應用程序發送。

由於傳輸大小的限制,我一次發送一個。每一個都應該「追加」到最後,因爲它們最終應該在內存中形成連續的空間,作爲圖像讀取(每像素一位)。

我試圖做這樣的事情:

int transNum = 0; 
uint8_t image[][] = new uint8t[12][12] //not sure about uint8_t, and I've forgotten how to do 'new' in C, I have to create just a pointer, and then malloc? 

receivedHandler(DictionaryIterator *iter, void *context){ 
    Tuple *receivedImage = dict_find(iter, KEY_IMG); 
    for (int i = 0; i < 12; i++) { 
     image[transNum][i] = receivedImage->value[i]->uint8_t; 
    } 
    transNum += 1; //this is in an implicit loop, since once done Pebble ACKs the transmission, and receivedHandler is called again by the next transmission 
} 

難道我甚至遠程關閉嗎?

回答

5

你可以分配連續的內存有12行& 96列

char* image = (char*)malloc(sizeof(char)*12*96); 

也,全球陣列會做的12 * 96字節就好

char image[12][96]; 

據我所知,你是接收數據行,即每次96個字節:

char rcvd_data[96]={0}; 

and access/set lik E本::

for(row=0;row<12;row++) //to point to the row (0-11 rows) 
{ 
    rcvd_data= recv_function(); //whatever your recv function is 
    for(col=0;col<96;col++) //to point to the col in that row (0-95 col) 
    { 
     *(image + row*96 + col)= rcvd_data[col]//whatever value you want to assign 
    } 
} 

,並一次性全部轉讓給96個字節:

for(row=0;row<12;row++) //to point to the row (0-11 rows) 
{ 
    rcvd_data= recv_function(); //whatever your recv function is 
    memcopy((image + row*96), rcvd_data, 96); 
} 
+0

當你說row/col時,內存是一維的。那麼我糾正這看起來像是「{r0c0,r0c1,...,r0c95,r1c0,...,r11c95}」嗎?我假設那裏有'i == col_no'? – OJFord

+0

是的,沒錯。是的,在上面的代碼中'i = col' – brokenfoot

+0

這兩個聲明之間的任何實際區別?我假設我是否使用'char image [12] [96];'然後我不訪問元素時取消引用。偏好的其他差異/原因? – OJFord

0

我認爲你需要的malloc兩次。

char** image = (char**)malloc(sizeof(char*)*12); 
int i = 0; 
for(; i < 12; ++i){ 
    image[i] = (char*)malloc(sizeof(char)*12); 
} 

然後,您可以將圖像視爲一個二維數組。

+0

這不是一個連續的記憶。 – brokenfoot

+0

是的,但這並不影響它在問題中的使用。 – FaceBro

+0

OP已經明確提到'每一個都應該'追加'到最後,因爲它們最終應該在內存中形成連續的空間,用於讀取圖像'。所以,這確實會影響問題。 – brokenfoot

1

分配你所描述的陣列最簡單的解決方法是:

uint8_t image[12][96]; 

然而,根據您的描述「每個人應該是‘附加’到最後,他們最終應該形成於存儲器中的順序空間「,這表明你真的想要:

uint8_t image[12 * 96]; 

然後你只需將你的12個傳輸按順序寫入該數組。

此代碼,您寫道:

for (int i = 0; i < 12; i++) { 
    image[byteNum][i] = receivedImage->value[i]->uint8_t; 
} 

是不對的,uint8_t是一種數據類型,而不是一個字段名。

另外,也許你想要做的事與image[i],而不是image[byteNum][i]雖然我不能沒有知道TupleType是什麼,你希望有多少在每個Tuple找到更具體。

+0

'image [12] [96];'和'image [12 * 96]之間的區別是什麼?難道他們都不會分配連續的內存嗎? – brokenfoot

+0

它們都分配連續的內存,但如果您嘗試將第一個字節視爲一長串字節,則它是未定義的。 (根據C標準,即使您確切知道下一個內存位置是什麼,也不允許您讀取數組邊界。 –

+0

來自Python,我更喜歡'two_d [i] [j]'。我只是覺得它對我的位置更透明。它使IMO更容易循環。 – OJFord

1

我會加上一件事是小心使用一個char。處理純字節數據時,使用類似unsigned char,signed charuint8_t的東西。雖然char是一個字節,但由於它的使用,我已經看到數據丟失。