Как установить значение в конкретном байте?

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
...

ОБНОВЛЕНИЕ: попробовал 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");
    }
}
  • 3
    Как вы планируете поместить 0xffc8 в один байт?
Теги:
shared-memory

2 ответа

2
Лучший ответ

Вы можете значительно упростить чтение и запись, объявив 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;
  • 0
    Спасибо за ваш совет, капитан - во всяком случае, я еще не смог установить новое значение.
  • 0
    Спасибо, капитан, теперь все работает. Я посмотрел на неправильную переменную :-)
2

Этот код:

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*.

  • 0
    Спасибо Билл - я попробовал ваш пример (см. Мой отредактированный пост) - к сожалению, безуспешно!
  • 2
    Таким образом, вы можете задавать лучшие вопросы, вы должны знать, что говорить «безуспешно» бесполезно. Скажите, что вы видели, и что вы ожидали увидеть.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню