如何将 8 位数组写入 1/2 大小的 16 位数组
How do I write an 8 bit array to a 16 bit array of 1/2 size
嘿,我正在为 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 位 spaces.
的内存位置
这个怎么写?
我原来的代码是这样的:
for(ii=0; ii<98; ii++)
{
memcpy(&vid_mem_front[ii*120], &bitheart_Bitmap[ii*98], 98);
}
但同样,这只会将 8 位复制到 16 位 space 对吗?
如何将两个连续的 8 位值复制到一个 16 位值中space?
预期输出:
0x1616, 0x1616, 0x1616, etc.
如果这不是很清楚请告诉我,我很不擅长解释我的问题...谢谢! :)
-punchki
How can I get it to copy two consecutive 8 bit values into a 16 bit space?
简单示例:
int8_t a[2];
int16_t b;
memcpy(&b, a, sizeof(a));
现在,您可以将该逻辑扩展到您的数据。
注意
如果您想将 b
视为 16
位整数,则必须考虑平台的字节顺序。要使代码端独立,可以使用:
b = (a[0] << 8) + a[1];
你想多了。假设,
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));
数组在内存中作为其元素类型的连续表示序列排列。
嘿,我正在为 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 位 spaces.
的内存位置这个怎么写?
我原来的代码是这样的:
for(ii=0; ii<98; ii++)
{
memcpy(&vid_mem_front[ii*120], &bitheart_Bitmap[ii*98], 98);
}
但同样,这只会将 8 位复制到 16 位 space 对吗?
如何将两个连续的 8 位值复制到一个 16 位值中space?
预期输出:
0x1616, 0x1616, 0x1616, etc.
如果这不是很清楚请告诉我,我很不擅长解释我的问题...谢谢! :)
-punchki
How can I get it to copy two consecutive 8 bit values into a 16 bit space?
简单示例:
int8_t a[2];
int16_t b;
memcpy(&b, a, sizeof(a));
现在,您可以将该逻辑扩展到您的数据。
注意
如果您想将 b
视为 16
位整数,则必须考虑平台的字节顺序。要使代码端独立,可以使用:
b = (a[0] << 8) + a[1];
你想多了。假设,
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));
数组在内存中作为其元素类型的连续表示序列排列。