Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Ios 如何从NSData将objective-c中的4个字节转换为浮点_Ios_Objective C - Fatal编程技术网

Ios 如何从NSData将objective-c中的4个字节转换为浮点

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值写入基础 以

下面是在objective-c中将4个字节转换为32位整数的示例。函数readInt从read函数中获取4个字节,然后将其转换为单个32位int。有人知道如何将4个字节转换为浮点吗?我相信它是大端的。基本上我需要一个readFloat函数。我永远无法理解这些逐位运算

编辑: 我忘了提到原始数据来自Java的DataOutputStream类。与java文档一致的writeFloat函数是

使用floatToIntBits方法将float参数转换为int 类中的浮点值,然后将该int值写入基础 以4字节数量输出流,高字节优先

这是Objective c试图提取java编写的数据

- (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阅读它。