memcpy 仅通过 C++ 复制一个字节

Posted

技术标签:

【中文标题】memcpy 仅通过 C++ 复制一个字节【英文标题】:memcpy only copying one byte over c++ 【发布时间】:2014-04-19 04:04:22 【问题描述】:

我正在尝试使用 memcpy 将 TCHAR 数组转换为 BYTE 数组,但 memcpy 函数仅将 1 个 TCHAR 从 tchar 数组复制到字节数组中。

我不知道为什么会这样。

这是一个代码 sn-p。

TCHAR test[] = L"This is a test string, its purpose is to do some testing!";
DWORD testSizeBytes = sizeof(TCHAR) * lstrlen(test);
LPBYTE byteArray = new BYTE[testSizeBytes+1];
memcpy(byteArray,test,testSizeBytes);

如果我使用这个 sn-p,byteArray 将只包含 'T';

任何帮助将不胜感激。

编辑:我解决了这个问题(这是一个错字)。我在这里编写的代码完美无缺。我的编译器在 Windows 虚拟机中,所以我不得不在这里重新输入它并在不知不觉中修正了错字。

【问题讨论】:

如果您对此感兴趣,请查看***.com/questions/4707012/c-memcpy-vs-stdcopy 您如何确定只复制了一个 TCHAR? 我试图避免使用任何我需要通过 std:: 访问的东西 我确定只有一个是使用调试器和断点复制的。 我怀疑你的调试器只显示第一个字符,因为这就是你的指针,它不知道你期望它是一个字符串。你试过检查后续的记忆吗? 【参考方案1】:
TCHAR test[] = L"This is a test string, its purpose is to do some testing!";

这是一个宽字符 (wchar_t) 字符串。在 Windows 上,定义了 UNICODE,即 UTF-16。在 UTF-16 中,字符 'T' 是 2 个字节。第一个字节对应于'T' 的ASCII 值(十进制84)。第二个字节是 0。因此,当您将其复制到字节数组时,它看起来像一个以空字符结尾的带有 1 个字符的 c 字符串。其他字符在那里,但它们出现在明显的 c 字符串的结尾之后,所以你的调试器显然忽略了它们。

【讨论】:

【参考方案2】:

正如 ajshort 的评论所提到的,您的调试器可能没有意识到您正在处理一个数组。

如果你可以使用你的调试器查看内存,尝试查看内存位置byteArray + 1byteArray + 2

我不在 Windows 上,所以我无法告诉您如何操作,但等效的 gdb 命令将是 x byteArray + 1

【讨论】:

以上是关于memcpy 仅通过 C++ 复制一个字节的主要内容,如果未能解决你的问题,请参考以下文章

c++中内存拷贝函数(C++ memcpy)详解

memcpy详解

C memcpy 以小字节序复制字节

复制时跳过 x 字节的 memcpy 等效项(不仅仅是初始 x 字节)?

memcpy在啥情况下会失败

将整数复制到缓冲区 memcpy C++