Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.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
Iphone 将NSData复制到int32_t变量中_Iphone_Ios_Nsdictionary - Fatal编程技术网

Iphone 将NSData复制到int32_t变量中

Iphone 将NSData复制到int32_t变量中,iphone,ios,nsdictionary,Iphone,Ios,Nsdictionary,我有一个很大的NSData字典,里面有很多NSData类型的条目。我有几个条目需要为int32_t类型,但是我不能100%确定如何跨多个条目复制NSDictionary条目中的数据 它是否像执行以下操作一样简单- .h .m 或者我的方法中是否需要某种类型的数据转换 还有一个简短的附带问题,我是否正确地声明了int32\t?我在文档和此处查找了一个示例,但我很难找到一个。是的,int32\t很好。所以你有一连串的反对意见。你需要知道的是字节的布局。如果你知道数据是什么,那么构建它就很容易了 给定

我有一个很大的NSData字典,里面有很多NSData类型的条目。我有几个条目需要为int32_t类型,但是我不能100%确定如何跨多个条目复制NSDictionary条目中的数据

它是否像执行以下操作一样简单-

.h

.m

或者我的方法中是否需要某种类型的数据转换


还有一个简短的附带问题,我是否正确地声明了int32\t?我在文档和此处查找了一个示例,但我很难找到一个。

是的,int32\t很好。所以你有一连串的反对意见。你需要知道的是字节的布局。如果你知道数据是什么,那么构建它就很容易了

给定一个长度为4(大小为int32_t)的NSData对象,您将:

int32_t val;
if([data length] == sizeof(uint32_t)) {
    void *bytes = [data bytes];
    // if the layout is same as iOS then
    memcpy(&val, bytes, sizeof(int32_t) );
}
如果不是这样,您可以尝试:

unsigned char val[4] = {0,0,0,0};
if([data length] == sizeof(uint32_t)) {
    memcpy(val, bytes, sizeof(int32_t) );
    then rearrange the bytes
}

您可以直接访问数据对象中的原始字节

void const *dataPtr = [data bytes];
现在您有了一个指向原始内存的指针,您可以以任何方式复制它(这些规则适用于任何数据传输,而不仅仅是iOS)。如果需要考虑对齐边界,则需要使用MeMCPY。

int32_t myInt;
memcpy(&myInt, dataPtr);
否则,如果在允许跨对齐边界进行整数操作的体系结构上

int32_t myInt = *(int32_t const *)dataPtr;
现在,ARM支持跨路线边界访问,但速度要慢得多。我没有做过性能比较,但您不会继续使用错误对齐的指针,因此它可能比memcpy函数调用更好(不过,老实说,这可能对您的性能考虑太多)

最大的问题是数据的字节顺序。如果它是由你提供的,那么你想做什么就做什么,但你应该更喜欢一个标准

如果它来自第三方,则可能是网络字节顺序(又名big-endian)。您可能需要转换为宿主endian表示形式。幸运的是,这对于
hton
ntoh
以及他们的朋友来说是直截了当的

FWIW,Intel是little endian,网络字节顺序是big endian,现代Mac和iOS设备是little endian,老式Mac是big endian

// Convert from network order to host order.
// Does the right thing wherever your code is running
myInt = ntohl(myInt);
简言之,要么

int32_t myInt = ntohl(*(int32_t const *)[data bytes]);

因此,数据必须以某种方式进入其中。这是,相反的

int32_t myInt = 42;
myInt = htonl(myInt);
NSData *data = [NSData dataWithBytesNoCopy:&myInt length:sizeof(myInt) freeWhenDone:NO];
当然,使用正确的数据初始值设定项。。。这只会使用堆栈上的原始字节,所以最好不要在堆栈展开后使用它


您不必担心发送的数据是否对齐,除非您向接收方保证数据将与某个边界对齐。

NSData
不响应
objectForKey:
您的意思是声明
NSDictionary
参数吗?opps yes NSDictionary是我的意思,它包含NSData的条目。。这就是我感到困惑的地方,我会修正我的问题,使其更易于阅读谢谢大家的帮助,我很抱歉它不是NSData的意外问题。幸运的是,我已经学会了如何将NSData传递给int32_t对象:)。。因此,现在我要开始了解如何将NSString转换为int32_tokay cool,我现在要尝试一下:)感谢您的快速响应,我会让您知道我的进展。在尝试使用void*bytes=[数据字节]时,我有一个警告;这表示使用“const void*”类型的表达式初始化“void*”会丢弃不确定如何处理的限定符。是的,这是因为[NSData bytes]返回一个“void const*”,这意味着它指向不希望您处理的数据。将其更改为“void const*bytes=[data bytes]”@JodyHagins谢谢-该警告的意思是变量声明应该说“不允许通过此指针写入”!好的。。这很有趣,因为有了Jody的解决方案,我在执行memcpy的线路上遇到了严重的故障。。我不知道这是不是我干的。。我现在正在读乔迪的解决方案,并打算尝试一下。。看看是怎么回事。当我尝试在这些示例中使用memcpy时,应用程序出现错误***由于未捕获的异常“NSInvalidArgumentException”终止应用程序,原因:'-[\uu NSCFString bytes]:未识别的选择器发送到实例0x2002c4f0',该错误意味着您正在将消息“bytes”发送到NSString,而NSString并没有实现该方法。因此,即使您的对象可能是“Data*”,但它实际上是一个“NSString*”,您确定您应该处理的是NSData对象而不是NSString对象吗?他们是两个完全不同的,不相关的类。是的。。。上帝啊我想也许我字典里的条目现在是字符串而不是数据。。。我已经很久没有编这本词典了,也许我把它和我做的其他事情弄混了。。而不是检查。。。我犯了一个严重的错误。。现在,我将检查它,并报告我的发现……好的,我从服务器接收到一堆二进制数据,我对其进行解析,以得到仍然是数据格式的xml。。但是我认为当我把它传递给解析器时,就是值被转换成字符串值的时候。我不确定,因为我使用的这个方法非常模糊,-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary*)attributeDict我应该进一步研究这个问题,但这就是我的数据变成字符串的地方,NSString有访问器方法将字符串转换为各种数字类型:doubleValue、floatValue、intValue、integerValue、LongValue、boolValue。
int32_t myInt = ntohl(*(int32_t const *)[data bytes]);
int32_t myInt;
memcpy(&myInt, [data bytes);
myInt = ntohl(myInt);
int32_t myInt = 42;
myInt = htonl(myInt);
NSData *data = [NSData dataWithBytesNoCopy:&myInt length:sizeof(myInt) freeWhenDone:NO];