Я работаю с 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
...
ОБНОВЛЕНИЕ: попробовал Bill adivce - к сожалению, это тоже не сработало:
if (d == 84){ // 0x42 = 66
*((PBYTE) pBuf + (d)) = 0x42;
}
ОБНОВЛЕНИЕ-2: попробовал капитан. Забавный совет - к сожалению, процедура написания не работала. Я не могу видеть шестнадцатеричное значение 42 в моем протоколе регистрации отладки-3.
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");
}
}
Вы можете значительно упростить чтение и запись, объявив pBuf
как std::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;
Этот код:
writeByte1 = *((PBYTE) pBuf + (d));
writeByte1 = 0xffc8;
копирует значение из pBuf
в local variabl writeByte1
, а затем изменяет локальную переменную на что-то другое.
Вместо этого попробуйте записать в буфер:
*((PBYTE) pBuf + (d)) = 0xff;
*((PBYTE) pBuf + (d+1)) = 0xc8;
Ответ для редактирования:
Код для изменения памяти работает, как вы можете видеть здесь: https://ideone.com/EKsvmU Проблема может заключаться в том, как вы работаете с MapViewOfFile
. Например, MapViewOfFile()
не возвращает FILE*
.
0xffc8
в один байт?