Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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中存储字节数组?_C_Pebble Watch_Pebble Sdk - Fatal编程技术网

如何在C中存储字节数组?

如何在C中存储字节数组?,c,pebble-watch,pebble-sdk,C,Pebble Watch,Pebble Sdk,这似乎是一个基本的问题,但我在任何地方都找不到答案 我知道C/C++没有字节数据类型。 我知道sizeofchar==1 我试图在Pebble上存储12个传输,每个96字节,就像从我的Android应用程序传输的一样 由于传输大小的限制,我一次发送一个。每一个都应该“附加”到最后一个,因为它们最终应该在内存中形成顺序空间,以便每像素读取一位图像 我正在尝试这样做: int transNum = 0; uint8_t image[][] = new uint8t[12][12] //not sur

这似乎是一个基本的问题,但我在任何地方都找不到答案

我知道C/C++没有字节数据类型。 我知道sizeofchar==1

我试图在Pebble上存储12个传输,每个96字节,就像从我的Android应用程序传输的一样

由于传输大小的限制,我一次发送一个。每一个都应该“附加”到最后一个,因为它们最终应该在内存中形成顺序空间,以便每像素读取一位图像

我正在尝试这样做:

int transNum = 0;
uint8_t image[][] = new uint8t[12][12] //not sure about uint8_t, and I've forgotten how to do 'new' in C, I have to create just a pointer, and then malloc?

receivedHandler(DictionaryIterator *iter, void *context){
    Tuple *receivedImage = dict_find(iter, KEY_IMG);
    for (int i = 0; i < 12; i++) {
        image[transNum][i] =  receivedImage->value[i]->uint8_t;
    }
    transNum += 1; //this is in an implicit loop, since once done Pebble ACKs the transmission, and receivedHandler is called again by the next transmission
}

我甚至可以远程关闭吗?

您可以分配12*96字节的连续内存,其中包含12行和96列

char*   image = (char*)malloc(sizeof(char)*12*96);
此外,全局数组也可以

char image[12][96];
据我所知,您正在按行接收数据,即每次96字节:

char rcvd_data[96]={0};
和访问/设置如下所示:

for(row=0;row<12;row++) //to point to the row (0-11 rows)
{
   rcvd_data= recv_function(); //whatever your recv function is
   for(col=0;col<96;col++) //to point to the col in that row (0-95 col)
   {
      *(image + row*96 + col)= rcvd_data[col]//whatever value you want to assign 
    }
}
要一次性传输所有96个字节:

for(row=0;row<12;row++) //to point to the row (0-11 rows)
{
   rcvd_data= recv_function(); //whatever your recv function is
   memcopy((image + row*96), rcvd_data, 96);
}

您可以分配12*96字节的连续内存,其中包含12行和96列

char*   image = (char*)malloc(sizeof(char)*12*96);
此外,全局数组也可以

char image[12][96];
据我所知,您正在按行接收数据,即每次96字节:

char rcvd_data[96]={0};
和访问/设置如下所示:

for(row=0;row<12;row++) //to point to the row (0-11 rows)
{
   rcvd_data= recv_function(); //whatever your recv function is
   for(col=0;col<96;col++) //to point to the col in that row (0-95 col)
   {
      *(image + row*96 + col)= rcvd_data[col]//whatever value you want to assign 
    }
}
要一次性传输所有96个字节:

for(row=0;row<12;row++) //to point to the row (0-11 rows)
{
   rcvd_data= recv_function(); //whatever your recv function is
   memcopy((image + row*96), rcvd_data, 96);
}

我想你需要去马洛克两次

char** image = (char**)malloc(sizeof(char*)*12);
int i = 0;
for(; i < 12; ++i){
   image[i] = (char*)malloc(sizeof(char)*12);
}

然后,您可以将图像视为二维数组。

我认为您需要对其进行两次malloc

char** image = (char**)malloc(sizeof(char*)*12);
int i = 0;
for(; i < 12; ++i){
   image[i] = (char*)malloc(sizeof(char)*12);
}

然后,您可以将图像视为二维数组。

分配您描述的数组的最简单解决方案是:

uint8_t image[12][96];
但是,根据您的描述,每一个都应该“附加”到最后一个,因为它们最终会在内存中形成连续的空间,这表明您实际上想要:

uint8_t image[12 * 96];
然后你只需将12次传输顺序写入该数组

这段代码是您编写的:

for (int i = 0; i < 12; i++) {
    image[byteNum][i] =  receivedImage->value[i]->uint8_t;
}
不正确,uint8\t是数据类型,而不是字段名


另外,您可能希望使用image[i]而不是image[byteNum][i]来执行某些操作,尽管在不知道元组类型是什么以及您希望在每个元组中找到多少元组的情况下,我无法更具体地说。

分配您描述的数组的最简单解决方案是:

uint8_t image[12][96];
但是,根据您的描述,每一个都应该“附加”到最后一个,因为它们最终会在内存中形成连续的空间,这表明您实际上想要:

uint8_t image[12 * 96];
然后你只需将12次传输顺序写入该数组

这段代码是您编写的:

for (int i = 0; i < 12; i++) {
    image[byteNum][i] =  receivedImage->value[i]->uint8_t;
}
不正确,uint8\t是数据类型,而不是字段名



另外,您可能希望使用image[i]而不是image[byteNum][i]来执行某些操作,尽管在不知道TupleType是什么以及您希望在每个Tuple中找到多少元组的情况下,我无法更具体地说明这一点。

我要补充的一点是小心使用char。在处理纯字节数据时,请使用无符号字符、有符号字符或uint8\t等。虽然一个字符是一个字节,但我已经看到由于它的使用而丢失了数据。

我要补充的一点是,只使用一个字符时要小心。在处理纯字节数据时,请使用无符号字符、有符号字符或uint8\t等。虽然char是一个字节,但我见过由于使用而丢失的数据。

当你说row/col时,内存是一维的。这看起来像{r0c0,r0c1,…,r0c95,r1c0,…,r11c95}对吗?我想我==col_no?是的,没错。是的,上面代码中的i=col两个声明之间有什么真正的区别吗?我假设如果我使用char image[12][96];那么我在访问元素时不会取消引用。偏好的其他差异/原因?对于这两个声明,引用元素的方式相同。基本上,无论哪种方式,都会得到一个char*映像,它指向一个12*96字节长的连续内存。当您说row/col时,您可以安全地不强制转换malloc的输出,内存是一维的。这看起来像{r0c0,r0c1,…,r0c95,r1c0,…,r11c95}对吗?我想我==col_no?是的,没错。是的,上面代码中的i=col两个声明之间有什么真正的区别吗?我假设如果我使用char image[12][96];那么我在访问元素时不会取消引用。偏好的其他差异/原因?对于这两个声明,引用元素的方式相同。基本上,无论哪种方式,您都会得到一个char*映像,它指向一个12*96字节长的连续内存。您可以安全地不强制转换malloc的输出。映像[12][96]之间的区别是什么;和图像[12*96]?它们不是都分配连续内存吗?它们都分配连续内存,尽管如果您试图将第一个内存视为一个长的字节序列,那么它是未定义的。根据C标准,即使您确切地知道下一个内存位置中的内容,也不允许读取超过数组边界的内容。我只是觉得我在哪里更加透明。在我看来,这也让循环变得更容易。@mattmcnab-你熟悉Pebble SDK吗?也许能在聊天中得到一些帮助会很感激的。我不是很不幸,我只是
我一直在阅读在线文档。使用一维数组并按96*i对其进行索引非常简单;和图像[12*96]?它们不是都分配连续内存吗?它们都分配连续内存,尽管如果您试图将第一个内存视为一个长的字节序列,那么它是未定义的。根据C标准,即使您确切地知道下一个内存位置中的内容,也不允许读取超过数组边界的内容。我只是觉得我在哪里更加透明。在我看来,这也让循环变得更容易。@mattmcnab-你熟悉Pebble SDK吗?如果你能帮我聊天的话,我会很感激的。我不是很遗憾,我只是一直在阅读在线文档。使用一维数组并按96*i对其进行索引非常简单。这不是一个连续的内存。是的,但这并不影响它在这个问题上的使用。OP明确提到“每个数组都应该“附加”到最后一个数组,因为它们应该在内存中形成顺序空间,以便作为图像读取”。所以,这确实会影响问题。我的错误。然后我认为直接定义一个映像[]是最好的方法。这不是一个连续的内存。是的,但这并不影响它在这个问题上的使用。OP明确提到“每个映像都应该“附加”到最后一个映像,因为它们应该在内存中形成顺序空间,以便作为映像读取”。所以,这确实会影响问题。我的错误。然后,我认为直接定义图像[]是最好的方法。