gpt4 book ai didi

ios - NSData getBytes 随机返回垃圾

转载 作者:行者123 更新时间:2023-11-29 10:39:43 24 4
gpt4 key购买 nike

我正在尝试在 iOS 应用程序中保存和加载自定义文件格式。该格式存储各种数据,但其中包括用户为 map 输入的名称。我随机发现,当我尝试读取此 map 名称(在文件中存储为 chars)时,我的 NSData 对象将读取垃圾。这是我读取 map 名称的代码(start 已设置为正确的开始位置):

NSData* data = ....;
uint mapNameLength;
char* mapNameChar;
NSString* mapNameString;

[data getBytes:&mapNameLength range:NSMakeRange(start, 4)];
start += 4;
mapNameChar = (char *)malloc(sizeof(char) * mapNameLength);
[data getBytes:mapNameChar range:NSMakeRange(start, mapNameLength)];
mapNameString = [NSString stringWithUTF8String:mapNameChar];

NSLog(@"mapNameLength: %u, mapNameChar: %s, Map name string: %@", mapNameLength, mapNameChar, mapNameString);

如您所见,我正在读取名称的长度,然后读取那么多 char 值,然后将其转换为 NSString。这是 NSLog 工作时的输出(我只是敲了一堆键盘来写一个长名字):

mapNameLength:49,mapNameChar:kandfianeifniwbvuandivbwirngiwnrivnwrivnwidnviwdv, map 名称字符串:kandfianeifniwbvuandivbwirngiwnrivnwrivnwidnviwdv

这是 NSLog 不工作时的输出:

mapNameLength:49,mapNameChar:kandfianeifniwbvuandivbwirngiwnrivnwrivnwidnviwdvfi?p?, map 名称字符串:(空)

那些“?”实际上是这里没有显示的特殊字符,所以我添加了它们。第一个是“ETX”,第二个是 Sublime Text 中的“SOH”。

要创建文件,这就是我正在做的:

NSString* mapName = ....;
uint mapNameLength = (uint)mapName.length;
NSMutableData* data = ....;
//...
//Write file type and version here
//...
[data appendBytes:&mapNameLength length:4];
[data appendData:[mapName dataUsingEncoding:NSUTF8StringEncoding]];
//...
//Write other stuff
//...

NSString* path = [FileManager applicationDocumentsDirectory];
path = [path stringByAppendingFormat:@"/%@", fileName];
BOOL success = [data writeToFile:path options:NSDataWritingAtomic error:&error];

我只写过一次文件,所以我知道数据总是一样的。那么,为什么我的数据对象有时会从中获取随机字节?

最佳答案

我不确定,但我不认为您正在存储终止 NUL 字符,因此您需要在读取字符串后将一个字符添加到缓冲区:

mapNameChar = (char *)malloc(sizeof(char) * (mapNameLength + 1));   // Add +1
[data getBytes:mapNameChar range:NSMakeRange(start, mapNameLength)];
mapNameChar[mapNameLength] = '\0'; // Terminate with NUL
mapNameString = [NSString stringWithUTF8String:mapNameChar];

最好还是忘记 malloc() 和 C 字符串,直接从 NSData 对象创建 NSString:

mapNameString = [[NSString alloc] initWithBytes:(const char *)([data bytes]) + start
length:mapNameLength
encoding:NSUTF8StringEncoding];

关于ios - NSData getBytes 随机返回垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25141556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com