将“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;
}
答案 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
数组中。这需要一些记忆,但是会为你节省很多麻烦,因为意外崩溃和其他什么。