Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将8位数组写入大小为1/2的16位数组_C_Arrays_Memory_Memcpy - Fatal编程技术网

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

C 如何将8位数组写入大小为1/2的16位数组,c,arrays,memory,memcpy,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, 0x1

嘿,我正在为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位空间

简单的例子:

int8_t a[2];
int16_t b;
memcpy(&b, a, sizeof(a));
现在,您可以将该逻辑扩展到您的数据

谨慎

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

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));

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

endianness可能有问题,我不知道OP是否希望使用16位值作为16位值显示以下代码:b=a[0]@Qnoobish,这些操作具有标准定义的行为,不管是否为endianness,您可能只需要将位图数据修改为{0x1616,0x1616,…},这对于i=0的简单C程序来说非常容易;对不起,伙计们,我发现了我的问题!你说得对,写得对。。。我的问题是我认为sqrt9216=98。。。事实上是96。。。
memcpy(shorts, bytes, sizeof(shorts));