我有一个二进制数组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’.
您不应该为此使用任何类型的批量复制例程,也不应该使用类型转换来获取指针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和直接指针抨击都将与这些函数之一做同样的事情,但你不知道它将是哪一个,并且只要你有这个任务,其中一个函数是正确的,另一个是错误.此外,如果你不知道从上下文中需要哪一个,那就去几个设计级别并弄清楚.