2017-04-14 69 views
1

我有這個問題與分配一個int爲char不行爲。 我有一個const char * 數據,這就像一個儲存型動物對象的尺寸。 我用這個,以驗證是否數據具有一個目的,如果是這樣,那麼我追加整數數據的大小相同。 的問題是,我希望,當我追加到數據,移動在ASCII表2點的位置,但如何數據表現爲字符串,我不明白如何運作這個加法。詮釋追加爲char,如我所料

例子:我有一個爲const char *數據存儲一個char「'」,以及具有96的值,如果我做:

data += 2; 

我希望的結果是b,但是是<與值60.

我使用函數sys_log來顯示發生了什麼。

功能啓動:

 void Boot(const char* data){ 
    [...] 
    /* 
    * OBJECT PROTO 
    */ 

    sys_log(0, "BOOT: OBJ PROTO data string: data = %s", data); 
    sys_log(0, "BOOT: OBJ PROTO size of data: %d", decode_2bytes(data)); 

    if (decode_2bytes(data) != sizeof(TObjectProto)) 
    { 
     sys_err("object proto table size error"); 
     thecore_shutdown(); 
     return; 
    } 
    sys_log(0, "BOOT: OBJ PROTO data after decode_2bytes(data): data = %s", data); 
    data += 2; 
    sys_log(0, "BOOT: OBJ PROTO data str + 2: data = %s", data); 

    size = decode_2bytes(data); 
    sys_log(0, "BOOT: OBJ PROTO data to size: size = %d", size); 

    data += 2; 
    sys_log(0, "BOOT: OBJ PROTO data str + 2: data = %s", data); 
    sys_log(0, "BOOT: OBJ PROTO data to size: size = %d", decode_2bytes(data)); 

    CManager::instance().LoadObjectProto((TObjectProto *) data, size); 

    sys_log(0, "To data assign %d * %d", size, sizeof(TObject)); 
    data += size * sizeof(TObjectProto); 
    sys_log(0, "BOOT: OBJ PROTO data str: data = %s", data); 

    [...] 

decode_2bytes():

inline WORD decode_2bytes(const BYTE *a) 
{ 
    return (*((WORD *) a)); 
} 

sys_log:

Apr 12 09:05:54.205886 :: BOOT: OBJ PROTO data string: data = ` 
Apr 12 09:05:54.205914 :: BOOT: OBJ PROTO size of data: 96 
Apr 12 09:05:54.205924 :: BOOT: OBJ PROTO data after decode_2bytes(data): data = ` 
Apr 12 09:05:54.205933 :: BOOT: OBJ PROTO data str + 2: data = < 
Apr 12 09:05:54.205948 :: BOOT: OBJ PROTO data to size: size = 60 
Apr 12 09:05:54.205961 :: BOOT: OBJ PROTO data str + 2: data = ½6 
Apr 12 09:05:54.205970 :: BOOT: OBJ PROTO data to size: size = 14013 
Apr 12 09:05:54.209238 :: To data assign 60 * 40 
Apr 12 09:05:54.209247 :: BOOT: OBJ PROTO data str: data = (

如可以在sys_log看到,我展示一下包含數據,值,並加上我得到的結果2.

+1

它看起來像您要添加2的指針,而不是 – Nattrass

+0

你沒有追加任何東西,你正在移動一個指針取消引用值。在ASCII中,反引號是96,'<'是60.你的緩衝區顯然是以{96,0,60,0,171,54,...'開頭的。 (並且你正嘗試將二進制數據打印爲一個字符串。)我推薦[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – molbdnilo

+0

你似乎忘記了'data'是一個指針。你將兩個添加到一個指針。 –

回答

2

數據+ = 2;

我希望爲b的結果,但<與值60

你只加2的指針,所以它會指向字符串的第3個字符,這是< 。如果字符串恰好在此之前結束,它甚至可能是一些隨機值。

遞增指針指向,你必須取消引用指針:

*data += 2; 

但是,這將引發一個編譯器錯誤,因爲data被聲明爲const char*

如果要修改字符串,將參數更改爲char* data

+0

我認爲'* data + = 2'會首先增加指針,然後解除引用,就像'while(* data ++)'? –

+0

@Stephan它首先對指針取消引用,然後遞增指向的值。 – zett42

+0

是的,你是對的。我剛剛發現'* data + = 1'與'* data ++'有些不同...... –