2013-11-28 150 views
0

我正在使用MapViewOfFile()和SharedMemory。我能夠逐字節讀取內存內容!現在我想知道,如何將新的十六進制值設置爲特定的字節?由於我的代碼,我希望在我的第二個console.log中,十六進制值0xffc8在單元格83中。不幸的是,情況並非如此。如何設置特定字節的值?

// main method 
FILE * pBuf = (FILE*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE); 
... 
int d; 
BYTE dbgByte; 
for(d = 0; d < 86; d++){ 
    dbgByte = *((PBYTE) pBuf + (d)); 
    printf("DEBUG byte %i hexvalue %hhx \n", d, (char) dbgByte); 
    printf("DEBUG byte %i int %i \n", d, (int) dbgByte); 
} 
// DEBUG - END 
for(d = 0; d < 86; d++){ 
    if (d == 83){ // 0xffc8 = 200 
    BYTE writeByte1; 
    writeByte1 = *((PBYTE) pBuf + (d)); 
    writeByte1 = 0xffc8; 
    } 
} 
// DEBUG 2 - START 
for(d = 0; d < 86; d++){ 
    dbgByte = *((PBYTE) pBuf + (d)); 
    printf("DEBUG byte %i hexvalue %hhx \n", d, (char) dbgByte); 
    printf("DEBUG byte %i int %i \n", d, (int) dbgByte); 
} 
// DEBUG - END 
... 

UPDATE:試圖Bill的書於 - 不幸的是這並沒有工作,以及:

if (d == 84){ // 0x42 = 66 
    *((PBYTE) pBuf + (d)) = 0x42; 
} 

更新2:試圖隊長不經意的建議 - 不幸的是,寫程序沒有工作。我在debug-3日誌記錄語句中看不到十六進制值42。

for(d = 0; d < 86; d++){ 
    byte = pBuf[d]; 
    printf("DEBUG-1 "); 
    printf("hex: %hhx; ", byte); 
    printf("char: %c; ", (char) byte); 
    printf("dec: %i; ", (int) byte); 
    printf(" byte %i; ", d); 
    printf("\n"); 
    if (d == 84){ // 0x42 = 66 
     pBuf[d] = 0x42; 
     printf("DEBUG-3 "); 
     printf("hex: %hhx; ", byte); 
     printf("char: %c; ", (char) byte); 
     printf("dec: %i; ", (int) byte); 
     printf(" byte %i; ", d); 
     printf("\n"); 
    } 
} 
+3

你打算如何將0xffc8放在一個字節中? – jwodder

回答

2

可以簡化閱讀並宣佈pBufstd::uint8_t*unsigned char*BYTE*代替FILE*大大寫。

std::uint8_t* pBuf = static_cast<std::uint8_t*>(
    MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE)); 

這將允許您操作數據作爲數組。您可能會然後從以下

var = *((PBYTE) pBuf + (d)); 

改變你讀一個字節的方式

var = pBuf[d]; 

這也使得改變值一樣簡單。

pBuf[d] = var; 
+0

感謝您的意見隊長 - 無論如何,我無法設置新的價值。 – Jochen

+0

謝謝船長,現在它工作。我看着錯誤的變量:-) – Jochen

2

此代碼:

writeByte1 = *((PBYTE) pBuf + (d)); 
writeByte1 = 0xffc8; 

副本從pBuf價值納入當地variabl writeByte1,然後改變局部變量是別的東西。

嘗試寫入緩衝,而不是:

*((PBYTE) pBuf + (d)) = 0xff; 
*((PBYTE) pBuf + (d+1)) = 0xc8; 

響應編輯:

的代碼來修改記憶的工作,因爲你可以在這裏看到:https://ideone.com/EKsvmU 該問題可能是與你是如何工作的與MapViewOfFile。例如,MapViewOfFile()不返回FILE*

+0

謝謝比爾 - 我試過你的例子(看我編輯過的帖子) - 不幸沒有成功! – Jochen

+2

所以你可以問更好的問題,你應該知道說「沒有成功」沒有幫助。說出你看到的,以及你期望看到的。 – Bill

+0

好吧,我期望看到我新設定的值('42(十六進制)'),我看到了舊的'00'。 – Jochen