将“unsigned char”数组转换为“unsigned short”数组的有效方法是什么?

时间:2011-06-13 08:32:32

标签: c++ arrays char short

将“unsigned char”数组转换为“unsigned short”数组的有效方法是什么?我通常使用以下代码片段来执行此操作。

#define CH_LINE_PIXELS       2291
#define SCANLINE_SIZE        57301
#define CH1_INDEX            2297
#define CH2_INDEX            4592
#define CH3_INDEX            6887
#define CH4_INDEX            9182

unsigned char* pUChar = new unsigned char[SCANLINE_SIZE];

unsigned short *pUS1, *pUS2, *pUS3, *pUS4;
pUS1 = reinterpret_cast<unsigned short *>(&pUChar[CH1_INDEX]);
pUS2 = reinterpret_cast<unsigned short *>(&pUChar[CH2_INDEX]);
pUS3 = reinterpret_cast<unsigned short *>(&pUChar[CH3_INDEX]);
pUS4 = reinterpret_cast<unsigned short *>(&pUChar[CH4_INDEX]);

unsigned short us1, us2;

for (unsigned int i = 0; i < CH_LINE_PIXELS; i++) 
{   
    us1 = pUChar[CH1_INDEX + 2 * i];
    us2 = pUChar[CH1_INDEX + 2 * x + 1];
    pUS1[x] = us1 * 0x100 + us2;

    us1 = pUChar[CH2_INDEX + 2 * i];
    us2 = pUChar[CH2_INDEX + 2 * i + 1];
    pUS2[x] = us1 * 0x100 + us2;

    us1 = pUChar[CH3_INDEX + 2 * i];
    us2 = pUChar[CH3_INDEX + 2 * i + 1];
    pUS3[x] = us1 * 0x100 + us2;

    us1 = pUChar[CH4_INDEX + 2 * i];
    us2 = pUChar[CH4_INDEX + 2 * i + 1];
    pUS4[x] = us1 * 0x100 + us2;
}

2 个答案:

答案 0 :(得分:0)

首先,你应该这样做:

us1 << 8 + us2而不是乘以0x100,因为您想要移动上部位置的前8位,然后移位比乘法更快。

E.g。你有us1 = aaaaaaaa(8位)和us2 = bbbbbbbb(另外8位)。将这些字符扩展为short可以简单地在左边用8个零填充它们。

然后上面的公式会给你:

00000000aaaaaaaa
<< 8
aaaaaaaa00000000
+ 00000000bbbbbbbb
aaaaaaaabbbbbbbb

另一方面,你应为你的结果分配一个新的短裤阵列

答案 1 :(得分:-1)

在字节边界上寻址short可能(或可能不会)导致对齐问题,具体取决于平台。

另外,乘法是非常无效的,为什么不使用移位呢? (有些编译器可能会优化x * 0x100,但如果他们不这样做 - 当你想要的只是x << 8时,这是一个巨大的性能影响......)

另外,如上所述,reinterpret_cast可能无法按预期工作。

我建议,因为无论如何都要进行分配,要将char数组中的值复制到单独的short数组中。这需要一些记忆,但是会为你节省很多麻烦,因为意外崩溃和其他什么。