将U08 *缓冲区转换为U16 *

时间:2013-07-02 12:14:13

标签: c++ casting

我收到了U08* _buffer,我需要将此参数传递给获取U16*的函数:

功能签名:FunctionA(U16 offset, U16 * pInbuff)

尝试这样称呼:FunctionA(0, (U16*)(m->GetBuffer));

获得

warning C4244: 'argument' : conversion from 'U32' to 'U16', possible loss of data
error C2220: warning treated as error- no 'object' file generated.

你知道如何使演员阵容正确吗?

3 个答案:

答案 0 :(得分:3)

如果U08U16分别是8和16位宽的无符号整数类型,那么正确的转换方法取决于缓冲区中的确切数据格式。

首先,即使缓冲区中的数据布局完全正确,简单的强制转换可能也不是正确的解决方案。除非你的U08缓冲区最初是一个U16*缓冲区,并且在该行的某个地方被强制转换为U08*,否则你可能遇到对齐问题,无论是崩溃还是性能不佳,都会遇到不适当的强制转换。如果是这种情况,那么解决方案是首先摆脱对U08*的投射,而不是将额外的投射添加回U16*

如果U08缓冲区中的数据布局对于您想要的U16缓冲区是正确的,那么您应该创建一个U08缓冲区,而不是创建U16缓冲区。 , 如果可能的话。如果填充U08缓冲区的代码无法更改为使用U16缓冲区,那么这可能是极少数情况下可以接受转换的情况之一;创建一个U16缓冲区,强制转换为U08*以填充它,然后您可以将U16缓冲区传递给您的函数而无需修改。

如果您不首先负责创建缓冲区,那么您可能需要创建自己的U16缓冲区,将数据从U08缓冲区复制到U16缓冲区(使用std :: memcpy或类似的),然后将U16缓冲区与FunctionA一起使用。

其次,如果U08缓冲区中的数据布局与预期的U16缓冲区中的数据布局不同,那么您必须创建自己的U16缓冲区并转换为U08数据。


此外,您显示的错误并未描述实际问题;它只是说你已经配置了编译器将警告视为错误并且有一些警告。这是一件好事,但你需要查看警告,找出你需要修理的东西,以使警告消失。


  

警告C4244:'参数':从'U32'转换为'U16',可能会丢失数据

据我所知,此警告与您展示的代码无关。你很幸运有一个警告,即使它可能是错误的,也会阻止你显示的代码静默编译。这是演员阵容真是个坏主意的原因之一;他们可以沉默严重的错误并隐藏错误。你不应该使用演员阵容,除非你真的知道你在做什么,甚至可能很少知道。

上述警告正在抱怨某些代码,其中U32值被分配给U16对象。例如:

U32 a = 1000000;
U16 b = a;

由于U32的有效值超过U16,因此并非所有U32值都可以转换为U16。无法用U32表示的U16值的转换可能会产生意外结果。所以你要么需要避免转换,要么确保你已经考虑了那些意外发生的事情。

答案 1 :(得分:0)

FunctionA(0, (U16*)(m->GetBuffer));

几乎可以肯定是

FunctionA(0, (U16*)(m->GetBuffer()));

当然,除非getBuffer是一个命名错误的指针而不是函数。

答案 2 :(得分:0)

如果您的类型是U08是无符号字节且U16是无符号16位字的整数,那么您可以通过填充数据来解决问题。以下代码应填充数据,并允许您将缓冲区作为无符号16位值的数组传递。

int bufferSize;  // set this value with the actual buffer size
U16 wordBuffer= new U16[bufferSize];
U16 *wordBufferIndexer = wordBuffer;
U08 *byteBufferIndexer = byteBuffer;
for (int i = 0; i < bufferSize; ++i)
{
    wordBufferIndexer = *(byteBufferIndexer++);
}

FunctionA(0, wordBuffer);