【问题标题】:memcpy - int variable to BYTEmemcpy - 到 BYTE 的 int 变量
【发布时间】:2011-04-26 23:34:15
【问题描述】:

我正在尝试使用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;
}

源示例已更新。现在可以正常构建了

【问题讨论】:

  • 你确定这段代码还能编译吗?我很确定那里有语法错误。
  • 那不会编译,你正在访问一个带有.的指针。
  • 这还能编译吗? &pPacket.Begin 看起来不对,因为 pPacket 是一个指针。
  • 我根据我的大项目写了这个简单的sn-p。
  • @Guy, e7 03 00 00 6f 00 00 00 0c 00 00 00,是输出:它工作正常。我不知道我为什么问这个问题。

标签: c++ c visual-studio visual-c++ memcpy


【解决方案1】:

您的代码可以正常工作。在 sizeof(int)==4 的 little-endian 机器上,数字 999 将存储为四个字节 0xe7、0x03、0x00、0x00。

您说您看到了字符“ç”:那是因为您试图将数组视为字符串,而 ç 的字符代码为 0xe7,这确实是写入的第一个字节。如果您将其视为一个数组(使用 Visual Studio 的内存视图,或通过在监视窗口中键入 pOutBuffer,12),您将看到正确的字节值。

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多