如何将8位数组写入1/2大小的16位数组

时间:2015-04-08 19:04:32

标签: c arrays memory memcpy

嘿,我正在为GBA做一些编程,而且我遇到了问题。

我有一个位图文件,看起来像这样:

const unsigned char bitheart_Bitmap[9216] = 
{
    0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
    0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
    0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
    0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
    0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
...}

当然并非所有的值都是0x16,但是你明白了。我想要做的是将这些值复制到一个包含16位空间的内存位置。

我怎么写这个?

我的原始代码是:

for(ii=0; ii<98; ii++)
{
    memcpy(&vid_mem_front[ii*120], &bitheart_Bitmap[ii*98], 98);
}

但是,这只是将8位复制到16位空间中吗?

如何将两个连续的8位值复制到16位空间?

预期产出:

0x1616, 0x1616, 0x1616, etc.

如果这不是很清楚,请告诉我,我在解释我的问题时非常糟糕......谢谢! :)

-punchki

2 个答案:

答案 0 :(得分:0)

  

如何将两个连续的8位值复制到16位空间?

简单示例:

int8_t a[2];
int16_t b;
memcpy(&b, a, sizeof(a));

现在,您可以将该逻辑扩展到您的数据。

<强>注意

如果要将b视为16位整数,则必须考虑平台的字节顺序。要使代码字节独立,您可以使用:

b = (a[0] << 8) + a[1];

答案 1 :(得分:0)

你正在过度思考这个问题。比如说,

uint8_t bytes[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
uint16_t shorts[8];

普通的memcpy会做正确的事情:

memcpy(shorts, bytes, sizeof(shorts));

数组在内存中作为元素类型的连续表示顺序排列。