2013-01-07 78 views
1

所以我在C字符數組...例如:添加的int字符數組

uchar arr[3] = { 0x34, 0x45, 0xFF } 

我正在尋找一個快速的方式爲整數添加到它(像其0x3445FF),所以例如如果我加2 arr中我得到:

{ 0x34, 0x46, 0x01 } 
+0

手動將初始數組轉換爲int,添加,轉換回來。 – pmg

+0

有沒有數組長度的特定範圍?我認爲,可能會進行一些惡意的比特級黑客攻擊。還有你的CPU類型? –

+1

@pmg要小心字節順序。 –

回答

3

最簡單和最好的方法是轉換爲int,然後再轉換回來。此外,你需要決定字節順序,因爲它從來不清楚。

此代碼假定大端,即陣列最初持有數量0x3445ff:

uint8_t arr[] = { 0x34, 0x45, 0xff }; 

uint32_t x = (arr[0] << 16) | (arr[1] << 8] | arr[2]; 

x += 2; 

arr[0] = (x >> 16) & 0xff; 
arr[1] = (x >> 8) & 0xff; 
arr[2] = x & 0xff; 
+0

所需的字節順序隱含在問題中,與您在此處所見的一樣。無論自然字節順序執行平臺如何,代碼都可以工作。我認爲這是點平臺獨立的字節排序? – Clifford

2

也許環路

int index = last_valid_index; 
while(index >= 0 && addend > 0) { 
    addend += array[index]; 
    array[index] = addend; 
    addend >>= 8; 
    --index; 
} 

足夠快?

+0

這很聰明!感謝您的展示。 – unwind

1

這是C.您可以將字符數組可能強制轉換爲整數數組和直接分配,像

uchar arr[20]; 
((int *)arr + index/sizeOf(int)) = your_int; 

但是,大小,低/大端等等將取決於int在您的平臺上的表示方式。這可能會導致可移植性問題。另外請注意,從00到FF的所有值都是可能的。例如,如果您稍後使用空終止符,則中間的00將爲您創建一個問題。另外,在我的示例代碼中,整數表示將sizeOf(int)對齊。

+0

我會在我回家時嘗試這個...我在OpenCL C(內核)中這樣做,所以便攜性不應該成爲問題! – Veles