Ios 如何从NSData将objective-c中的4个字节转换为浮点
下面是在objective-c中将4个字节转换为32位整数的示例。函数readInt从read函数中获取4个字节,然后将其转换为单个32位int。有人知道如何将4个字节转换为浮点吗?我相信它是大端的。基本上我需要一个readFloat函数。我永远无法理解这些逐位运算 编辑: 我忘了提到原始数据来自Java的DataOutputStream类。与java文档一致的writeFloat函数是 使用floatToIntBits方法将float参数转换为int 类中的浮点值,然后将该int值写入基础 以4字节数量输出流,高字节优先 这是Objective c试图提取java编写的数据Ios 如何从NSData将objective-c中的4个字节转换为浮点,ios,objective-c,Ios,Objective C,下面是在objective-c中将4个字节转换为32位整数的示例。函数readInt从read函数中获取4个字节,然后将其转换为单个32位int。有人知道如何将4个字节转换为浮点吗?我相信它是大端的。基本上我需要一个readFloat函数。我永远无法理解这些逐位运算 编辑: 我忘了提到原始数据来自Java的DataOutputStream类。与java文档一致的writeFloat函数是 使用floatToIntBits方法将float参数转换为int 类中的浮点值,然后将该int值写入基础 以
- (int32_t)read{
int8_t v;
[data getBytes:&v range:NSMakeRange(length,1)];
length++;
return ((int32_t)v & 0x0ff);
}
- (int32_t)readInt {
int32_t ch1 = [self read];
int32_t ch2 = [self read];
int32_t ch3 = [self read];
int32_t ch4 = [self read];
if ((ch1 | ch2 | ch3 | ch4) < 0){
@throw [NSException exceptionWithName:@"Exception" reason:@"EOFException" userInfo:nil];
}
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}
[data getBytes:&myFloat range:NSMakerRangeLocationWhereFloatStarts,sizeoffloat]应该可以做到这一点。[data getBytes:&myFloat range:NSMakerRangeLocationWhereFloatStarts,sizeoffloat]应该做到这一点。假设数据来自DataOutputStream的方法,然后将其记录下来,用于创建整数表示。进一步说明如何解释该表示 我不确定这是否是同一件事,但xdr API似乎可以处理这种表示。上的信用是指Sun Microsystems的标准/规范,因此它似乎与Java有关 因此,可以采取以下措施:
// At top of file:
#include <rpc/types.h>
#include <rpc/xdr.h>
// In some function or method:
XDR xdr;
xdrmem_create(&xdr, (char*)data.bytes + offset, data.length - offset, XDR_DECODE);
float f;
if (!xdr_float(&xdr, &f))
/* handle error */;
xdr_destroy(&xdr);
如果数据由外部数据表示中的整个流组成,那么您将为从中提取项目的整个任务创建一个XDR流,并使用多个XDR\u。。。在创建和销毁它之间调用以提取所有项。如果数据来自DataOutputStream的方法,则记录该方法以用于创建整数表示。进一步说明如何解释该表示 我不确定这是否是同一件事,但xdr API似乎可以处理这种表示。上的信用是指Sun Microsystems的标准/规范,因此它似乎与Java有关 因此,可以采取以下措施:
// At top of file:
#include <rpc/types.h>
#include <rpc/xdr.h>
// In some function or method:
XDR xdr;
xdrmem_create(&xdr, (char*)data.bytes + offset, data.length - offset, XDR_DECODE);
float f;
if (!xdr_float(&xdr, &f))
/* handle error */;
xdr_destroy(&xdr);
如果数据由外部数据表示中的整个流组成,那么您将为从中提取项目的整个任务创建一个XDR流,并使用多个XDR\u。。。在创建和销毁之间调用以提取所有项。包含读取、写入和转换整数数据的函数
您可以使用OSSwapBigToHostInt32将大端整数转换为本机表示形式,然后将位复制到浮点:
NSData* data = [NSData dataWithContentsOfFile:@"/tmp/java/test.dat"];
int32_t bytes;
[data getBytes:&bytes length:sizeof(bytes)];
bytes = OSSwapBigToHostInt32(bytes);
float number;
memcpy(&number, &bytes, sizeof(bytes));
NSLog(@"Float %f", number);
包含用于读取、写入和转换整数数据的函数
您可以使用OSSwapBigToHostInt32将大端整数转换为本机表示形式,然后将位复制到浮点:
NSData* data = [NSData dataWithContentsOfFile:@"/tmp/java/test.dat"];
int32_t bytes;
[data getBytes:&bytes length:sizeof(bytes)];
bytes = OSSwapBigToHostInt32(bytes);
float number;
memcpy(&number, &bytes, sizeof(bytes));
NSLog(@"Float %f", number);
我试过了,我想它需要转换成big-endian我试过了,我想它需要转换成big-endian你需要知道浮点在字节中的表示形式。这些数据来自哪里?数据源或协议是否有规范或类似文档?@Kenthomass它来自Java的DataOutputStream类。我试图通过ios读取它。你需要知道浮点的字节表示形式。这些数据来自哪里?数据源或协议是否有规范或类似文档?@Kenthomass它来自Java的DataOutputStream类。我正在试着通过ios阅读它。