0

1)我有一个大缓冲区 2)我有很多几乎每种类型的变量,

我使用此缓冲区以不同的字节顺序发送到多个目的地。

当我发送到网络字节顺序时,我通常使用 htons 或 htonl 以及针对特定数据类型的自定义函数,

所以我的问题

每次构建缓冲区时,我都会更改每个变量的字节顺序,然后使用 memcpy。

但是,有没有人知道更好的方法,就像我希望有一个具有特定预期字节顺序的高效 memcpy

一个例子,

UINT32 dwordData = 0x01234567;
UINT32 dwordTmp = htonl(dwordData);
memcpy(&buffer[loc], &dwordTmp, sizeof(UNIT32));
loc += sizeof(UNIT32);

这只是我随便写的一个例子顺便说一句

我希望有一个看起来像的功能

memcpyToNetwork(&buffer[loc], &dwordTmp, sizeof(UNIT32));

如果您知道我的意思,命名只是描述性的,并且根据数据类型,它会为特定数据类型执行字节顺序,因此我不必手动更改顺序并有一个临时变量要复制到,节省复制两次.

4

1 回答 1

3

没有标准的解决方案,但自己编写相当容易。

在我的脑海中,轮廓可能如下所示:

// Macro to be able to switch easily between encodings. Just for convenience
#define WriteBuffer WriteBufferBE 

// Generic template as interface specification. Not implemented itself
// Takes buffer (of sufficient size) and value, returns number of bytes written
template <typename T>
size_t WriteBufferBE(char* buffer, const T& value);

template <typename T>
size_t WriteBufferLE(char* buffer, const T& value);

// Specializations for specific types
template <>
size_t WriteBufferBE(char* buffer, const UINT32& value)
{
    buffer[0] = (value >> 24) & 0xFF;
    buffer[1] = (value >> 16) & 0xFF;
    buffer[2] = (value >> 8) & 0xFF;
    buffer[3] = (value) & 0xFF;
    return 4;
}

template <>
size_t WriteBufferBE(char* buffer, const UINT16& value)
{
    buffer[0] = (value >> 8) & 0xFF;
    buffer[1] = (value) & 0xFF;
    return 2;
}

template <>
size_t WriteBufferLE(char* buffer, const UINT32& value)
{
    buffer[0] = (value) & 0xFF;
    buffer[1] = (value >> 8) & 0xFF;
    buffer[2] = (value >> 16) & 0xFF;
    buffer[3] = (value >> 24) & 0xFF;
    return 4;
}

template <>
size_t WriteBufferLE(char* buffer, const UINT16& value)
{
    buffer[0] = (value) & 0xFF;
    buffer[1] = (value >> 8) & 0xFF;
    return 2;
}

// Other types left as an exercise. Can use the existing functions!

// Usage:
loc += writeBuffer(&buffer[loc], dwordData);
于 2013-05-28T15:43:05.010 回答