簡體   English   中英

Obj-c:如何將2d C數組添加到NSData

[英]Obj-c: How to add a 2d C array to NSData

我有一個像這樣的二維數組:

struct myStruct twoDarray[maxX][maxY];

我可以遍歷該數組,並看到所有值均已正確分配。 我正在嘗試將此數組放入NSData對象,例如:

NSData *myData = [NSData dataWithBytes:&twoDarray length:sizeof(struct myStruct) * actualX * actualY];

此分配成功。 myData.length顯示預期的大小(結構* x * y)。 關於這個問題的公認答案表明這是正確的語法: 是否可以在info.plist中存儲2D數組

最終,我嘗試通過循環讀回數組:

int start = 0;
for (int x = 0; x < actualX; x++)
{
    for (int y = 0; y < actualY; y++)
    {
        struct myStruct readBack
        [myData getBytes:&readBack range:NSMakeRange(start, sizeof(struct myStruct))];
        start += sizeof(struct myStruct)
     }
}

但是,當x = 0時,我只能在提取循環中獲得有效數據。如果x = 0,則表示y的所有值的所有結構都是正確的。 對於任何大於或等於1的x, readBack中的所有值均為0。

我現在不確定我要去哪里。 如果我通過twoDarray進行迭代,則肯定具有所有x值的數據。 為什么當x大於或等於1時數據歸零?

對於C數組,&twoDarray實際上是指向數組第一個元素afaik的指針,因此它只是將第一個元素放入NSData中。 也許將每個元素(x而不是x和y)寫入一個NSData對象,然后將它們組合

NSData *data1 = ... 
NSData *data2 = ... 
NSMutableData *completeData = [data1 mutableCopy];
[completeData appendData:data2];

然后,我猜您以這種方式讀取數據的原因是,元素為零,因為新的NSData對象開始時的內存為零,因此,如果您的NSData為X * n且您只需要輸入X * 1的數據,其余的將為0

如@macmoonshine所述,可以使用appendData:length:而不是為每個元素創建臨時NSData對象,這將更加高效

您的數組是一個指針數組。 對於您的方法,使用單個數組並將二維索引轉換為一維索引更加容易:

struct myStruct twoDarray[maxX*maxY];
// twoDarray[x][y] is equivalent to twoDarray[x * maxY + y]

您可以像寫數據一樣讀回數據

[myData getBytes:&readBack length:sizeof(struct myStruct) * maxX * maxY];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM