2009-11-22 37 views
1

我嘗試將字符串存儲到一個整數如下字符串:保存在一個int

我讀的字符串的字符,每4個字符我這樣做:

val = (int) ch << 24 | (int) ch << 16 | (int) ch << 8 | (int) ch; 

然後我把整數值,稱爲內存整數數組(=> int memory[16])。

我想以一種自動的方式爲每一個字符串的長度做到這一點,再加上我很難再次爲任意大小的字符串反轉該過程。任何幫助?

編輯:

(從下方)

基本上,我做在JAVA的練習。這是一個MIPS模擬器系統。我有註冊,基準,指令,標籤,控制,APSImulator類和其他。當我嘗試從一個數組加載程序到模擬器的內存時,我實際上讀取了被稱爲'程序'的數組的所有內容並將其放入內存中。內存是2048長,32位寬。寄存器也是32位整數。所以當數組中有像Datum.datum(「string」)這樣的內容時 - Datum類有IntDatum和StringDatum子類 - 我有辦法將「字符串」存儲在模擬器的內存數據段中。內存是0-1023文本和1024-2047數據區域。我也必須用空字符分隔字符串 - 加上任何檢查完整的內存等我找出一種方法來存儲字符串MemContents(引用類型 - 空接口 - 由類實現的內存字段屬於)是將字符串每個(2或4個符號)存儲到一個寄存器,然後取出寄存器的內容並將其存儲在內存中。所以,我發現很難實現這一點,反過程也是如此。

+0

你能保證輸入的長度是4個字符的整數倍? – 2009-11-22 23:34:00

+1

您是使用C還是Java?您使用兩種語言標記 – 2009-11-22 23:34:54

+4

爲什麼要在int數組中使用?不會有char數組是更直接嗎? – 2009-11-22 23:35:30

回答

-1

在C中執行此操作的一種常用方法是使用union。它可能看起來像

union u_intstr { 
    char fourChars[4]; 
    int singleInt; 
}; 

設置字符到工會作爲

union u_intstr myIntStr; 
myIntStr.fourChars[0] = ch1; 
myIntStr.fourChars[1] = ch2; 
myIntStr.fourChars[2] = ch3; 
myIntStr.fourChars[3] = ch4; 

,然後訪問INT爲

printf("%d\n", myIntStr.singleInt); 

編輯

根據你的情況爲16整個工會可以擴展到看起來像

union u_my16ints { 
    char str[16*sizeof(int)]; 
    int ints[16]; 
}; 
+0

這取決於執行環境的字排序,而OP的原始代碼沒有。 – caf 2009-11-22 23:52:39

+0

@caf確實如此,但您可以確定這些字符像字符串一樣排列。 – epatel 2009-11-22 23:54:54

+0

這是Java,而不是C. – 2009-11-23 09:21:04

1

如果你在C中工作,你的字符串是一個char數組的大小爲int的大小的數組,你可以將指針指向char數組,將它轉換爲指向int數組,並對int數組做任何你想做的事情。如果沒有這最後的保障,你可以簡單地寫在飛行中產生的int數組功能:

size_t IntArrayFromString(const char * Source, int ** Dest) 
{ 
    size_t stringLength=strlen(Source); 
    size_t intArrElements; 
    intArrElements=stringLength/sizeof(int); 
    if(stringLength%sizeof(int)!=0) 
     intArrElements++; 
    *Dest=(int *)malloc(intArrElements*sizeof(int)); 
    (*Dest)[intArrElements-1]=0; 
    memcpy(Dest, Source, stringLength); 
    return intArrElements; 
} 

調用方負責釋放目的地緩衝區。 (我不知道它是否真的有效,我沒有測試)

-1

這是我想出

​​

由於使用釋放calloc(中),得到的緩衝區有至少有一個NULL,可能會填充最後一個整數。這是不可移植的,因爲整數是以本地字節順序。

+0

他希望在Java中有一個解決方案,而不是C. – 2009-11-23 09:21:40

0

基本上,我在JAVA做一個練習。這是一個MIPS模擬器系統。我有註冊,基準,指令,標籤,控制,APSImulator類和其他。當我嘗試從一個數組加載程序到模擬器的內存時,我實際上讀取了被稱爲'程序'的數組的所有內容並將其放入內存中。內存是2048長,32位寬。寄存器也是32位整數。所以當數組中有像Datum.datum(「string」)這樣的內容時 - Datum類有IntDatum和StringDatum子類 - 我有辦法將「字符串」存儲在模擬器的內存數據段中。內存是0-1023文本和1024-2047數據區域。我也必須用空字符分隔字符串 - 加上任何檢查完整的內存等我找出一種方法來存儲字符串MemContents(引用類型 - 空接口 - 由類實現的內存字段屬於)是將字符串每個(2或4個符號)存儲到一個寄存器,然後取出寄存器的內容並將其存儲在內存中。所以,我發現很難實現這一點,反過程也是如此。

+0

Ponty:用這個來編輯問題。 – Spoike 2009-11-23 07:37:39

1

您是否考慮過簡單地使用String.getBytes()?然後,您可以使用字節數組創建int S(例如,使用BigInteger(byte[])構造。

這可能不是最有效的解決方案,但可能不太容易出錯,更具可讀性。