0

CAFAudioDescriptionmSampleRate成员是一种Float64类型,但是要为其分配一个像 44100.0 这样的值,我需要先将其转换为大端。该函数CFConvertFloat64HostToSwapped返回 a CFSwappedFloat64,它是 a uint64_t,而不是Float64

为什么它返回一个 int 类型?我什至无法将其转换为Float64.

    // required file header
    CAFFileHeader fileHeader;
    fileHeader.mFileType = CFSwapInt32HostToBig('caff');
    fileHeader.mFileVersion = CFSwapInt16HostToBig(1);
    fileHeader.mFileFlags = CFSwapInt16HostToBig(0);

    // required chunk header for audio description chunk below
    CAFChunkHeader audioHeader;
    audioHeader.mChunkType = CFSwapInt32HostToBig('desc');
    audioHeader.mChunkSize = sizeof(CAFAudioDescription);

    // required first chunk
    CAFAudioDescription audioChunk;
    audioChunk.mSampleRate = CFConvertFloat64HostToSwapped(44100.0); // type mismatch
4

2 回答 2

1

我只是 Objective-C 的初学者,我没有使用过这个 API,但是:

uint64_t 就是这样,它是 64 位的东西。但是,存储在这 64 位中的不是整数,而是转换后的 Float64。它没有 Float64 类型,因为它不是Float64,而是转换后的Float64。

于 2013-10-23T10:29:02.290 回答
1

当您更改字节顺序时,该值对主机系统不再有意义。它只是一堆比特。

没有理由不能将这些位存储为任何可以容纳 64 位的类型,甚至Float64.

但是,字节顺序交换通常通过位移位和掩码来完成,并且由于无符号整数类型最适合这项工作(您不能使用浮点数来完成),因此位模式可能会uint64_t在操作之前分配。

您可以在操作后将位移回浮点类型,但这将是额外的步骤,并且值无论如何都没有意义。

有符号整数转换不必首先转换为无符号整数,因为位操作适用于它们。不过,为了 API 的一致性,这样做会很好,因为交换的有符号整数上的数值也没有意义。

于 2013-10-23T11:13:08.593 回答