memcpy - переменная типа int в BYTE - PullRequest
0 голосов
/ 27 апреля 2011

Я пытаюсь создать пакет данных, используя memcpy. Я ожидаю увидеть вывод в pOutBuffer, первые четыре байта которого будут иметь 999, затем 111 и 12; Но в настоящее время я получаю немного мусора.

Проблема в том, что вместо копирования значения, я думаю, он копирует адрес. Как я могу скопировать эти значения в непрерывную память, чтобы я мог записать их на диск и получить данные на принимающей стороне в моем определенном формате?

Спасибо.

#include "stdafx.h"
#include "windows.h"
typedef struct
{
    int Begin;
    int End;
    int Size;
}PACKET;


void AddBuffer(PACKET* pPacket, BYTE* pOutBuffer)
{
    memcpy(pOutBuffer, &pPacket->Begin, sizeof(int));
    memcpy(pOutBuffer+sizeof(int), &pPacket->End, sizeof(int));
    memcpy(pOutBuffer+sizeof(int)+sizeof(int), &pPacket->Size, sizeof(int));
}

int _tmain(int argc, _TCHAR* argv[])
{
    PACKET* pPacket = new PACKET;
    pPacket->Begin = 999;
    pPacket->End   = 111;
    pPacket->Size  = 12;

    BYTE* pOutBuffer = new BYTE [pPacket->Size];
    AddBuffer(pPacket, pOutBuffer);

    //Write pOutBuffer on to the disk 
    //WriteFile(vhFileToWrite,(BYTE*)pOutBuffer,pPacket.Size,&vRetFileSize,NULL);

    //Delete pOutBuffer
    return 0;
}

Исходный образец обновлен. Теперь он строит нормально

1 Ответ

3 голосов
/ 27 апреля 2011

Ваш код работает правильно.На машине с прямым порядком байтов с sizeof (int) == 4 число 999 будет храниться как четыре байта 0xe7, 0x03, 0x00, 0x00.

Вы сказали, что видели символ 'ç':это потому, что вы пытаетесь просмотреть массив как строку, и ç имеет код символа 0xe7, который действительно является первым записанным байтом.Если вы просматриваете его как массив (используя представление памяти Visual Studio или введя pOutBuffer,12 в окне просмотра), вы увидите правильные значения байтов.

...