使用std :: copy将char数组中的两个字节复制到unsigned short中

din*_*yar 2 c++

我有一个二进制数组char buffer[N];,其中包含两个字节,在其开头被解释为unsigned short,并且我正在通过执行来提取它们

unsigned short size= 0;
memcpy((char *) &size, buffer, sizeof(unsigned short));
Run Code Online (Sandbox Code Playgroud)

但是,我想为此使用std :: copy.这可能吗?

尝试过像

std::copy(buffer, buffer+sizeof(unsigned short), (char *) &size);
Run Code Online (Sandbox Code Playgroud)

编译时导致各种错误..

编辑:对不起,我赶时间忘了:这是在使用gcc 4.4.3的Ubuntu GNU/Linux系统上.错误消息是Error: Invalid conversion from ‘char*’ to ‘char’.

zwo*_*wol 6

您不应该为此使用任何类型的批量复制例程,也不应该使用类型转换来获取指针unsigned short,因为这些选项都不考虑字节顺序.从char[]缓冲区中提取双字节无符号整数的正确方法是使用以下函数之一:

unsigned short extract_littleend16(const unsigned char *buf)
{
    return (((unsigned short)buf[0]) << 0) |
           (((unsigned short)buf[1]) << 8);
}

unsigned short extract_bigend16(const unsigned char *buf)
{
    return (((unsigned short)buf[0]) << 8) |
           (((unsigned short)buf[1]) << 0);
}
Run Code Online (Sandbox Code Playgroud)

std::copy,memcpy和直接指针抨击都将与这些函数之一做同样的事情,但你不知道它将是哪一个,并且只要你有这个任务,其中一个函数是正确的,另一个是错误.此外,如果你不知道从上下文中需要哪一个,那就去几个设计级别并弄清楚.

  • @Zack:所以如果我告诉你,缓冲区中数据的唯一"错误"是它可能是错误对齐的,但是否则它肯定是主机字节顺序中`unsigned short`的对象表示,你编写代码来检查主机顺序是大端还是小端,这样你就可以调用两个函数中正确的一个?或者在有限的情况下,你会从"你必须明确选择字节顺序并调用相应的函数"回来吗? (4认同)
  • 既然我们很挑剔,也许我应该使用C风格的演员代替`static_cast`来投票!如果OP不关心字节顺序,那么很可能他的目标平台的字节顺序保留在char数组中,并且他不需要担心它.你的答案是可行的方式,但是当他们的解决方案同样适用于OP时,仍然没有理由拒绝其他人.(因为你的解决方案有效,我实际上并没有低估) (3认同)