日期:2014-05-19  浏览次数:20920 次

复制拷贝 byte数组,应该用哪个API????
截取一个byte[]中的   任意和byre[]复制拷贝   给另一个   byte[],应该用哪个API????
C#有函数可以实现!!Buffer.BlockCopy

但我的目的是哟啊知道实现这个功能用哪个API函数??!!!
请问应该用哪个???

------解决方案--------------------

memcpy(源地址,目标地址,长度)
原地址 byte[] a = {1,2,3,4,5,6,7}
目标地址 byte[] b = new byte[3];

截取 a 中 3,4,5 拷贝到 b


memcpy(源地址,远地址第2下标,远地址第4下标,目标地址,长度)

???
这样怎么写?????
c++里
memcpy(a+3,b,3);
------解决方案--------------------
--------------------------
Red_angelX(八戒) ( ) 信誉:100 Blog 加为好友 2007-04-18 14:45:06 得分: 0


没有CopyMemory这个API 只有Rtl**CopyMemory

memcpy似乎是标准库里面的函数 我寒了...
--------------------------

CopyMemory
The CopyMemory function copies a block of memory from one location to another.

VOID CopyMemory(
PVOID Destination, // pointer to address of copy destination
CONST VOID *Source, // pointer to address of block to copy
DWORD Length // size, in bytes, of block to copy
);

Parameters
Destination
Pointer to the starting address of the copied block 's destination.
Source
Pointer to the starting address of the block of memory to copy.
Length
Specifies the size, in bytes, of the block of memory to copy.
Return Values
This function has no return value.

Remarks
If the source and destination blocks overlap, the results are undefined. For overlapped blocks, use the MoveMemory function.

QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Unsupported.
Header: Declared in winbase.h.

See Also
Memory Management Overview, Memory Management Functions, CopyMemoryVlm, FillMemory, FillMemoryVlm, MoveMemory, MoveMemoryVlm, ZeroMemory



------解决方案--------------------
下面是Buffer.BlockCopy调用的实际C++代码,没有直接API,分32位和64位两种方式调用。
#if defined(_X86_)
//This is a replacement for the memmove intrinsic.
//It performs better than the CRT one and the inline version.
// On WIN64 the CRT implementation of memmove is actually faster than the CLR implementation of m_memmove().
void m_memmove(BYTE* dmem, BYTE* smem, int size)
{
CONTRACTL
{
NOTHROW;
GC_NOTRIGGER;
MODE_COOPERATIVE;
PRECONDITION(CheckPointer(dmem));
PRECONDITION(CheckPointer(smem));
PRECONDITION(size > = 0);
SO_TOLERANT;
}
CONTRACTL_END;

#if defined(_WIN64) || defined(ALIGN_ACCESS)
// Bail out and use the slow version if the destination and the source don 't have the same alignment.
if ( ( ((SIZE_T)dmem) & (sizeof(SIZE_T) - 1) ) !=
( ((SIZE_T)smem) & (sizeof(SIZE_T) - 1) ) )
{
memmove(dmem, smem, size);
}
else
#endif // _WIN64 || ALIGN_ACCESS
if (dmem <= smem)
{
// make sure the destination is pointer-aligned
while (( ((SIZE_T)dmem) & (sizeof(SIZE_T) - 1) ) != 0 && size > = (int)(sizeof(SIZE_T) - 1))
{
*dmem++ = *smem++;
size -= 1;
}

// copy 16 bytes at a time
if (size > = 16)
{
size -= 16;
do
{
((DWORD *)dmem)[0] = ((DWORD *)smem)[0];