2013-10-23 70 views
0

CAFAudioDescriptionmSampleRate成員是Float64類型,但爲其賦值類似44100.0,我需要先將其轉換爲big-endian。函數CFConvertFloat64HostToSwapped返回CFSwappedFloat64這是一個uint64_t,而不是Float64CAFAudioDescription成員類型和字節順序

爲什麼它返回一個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 

回答

1

當您更改字節順序時,該值對主機系統不再有意義。這只是一堆點。

沒有理由不能將這些位存儲到任何可以容納64位的類型,即使是Float64

但是,字節序交換通常是通過位移和掩碼來完成的,而且由於無符號整數類型最適合作業(不能用浮點數來完成),所以在操作之前可能將位模式分配爲uint64_t

您可以在操作後將位移回到浮點類型,但這將會是額外的步驟,並且值無論如何都是沒有意義的。

有位整數轉換不必首先轉換爲無符號整數,因爲位操作與它們一起工作。儘管如此,爲API一致性做這樣做會很好,因爲交換有符號整數的數值也沒有意義。

+0

謝謝。任何線索,我將如何分配uint64_t到Float64沒有編譯錯誤? – Morrowless

1

我只能用Objective-C的初學者,我沒有用過這個API,但:

的uint64_t中就是如此它是什麼64位。儘管如此,存儲在這64位中的數據不是整數,而是轉換後的Float64。它沒有Float64類型,因爲它不是一個Float64,而是一個轉換成 Float64。

+0

但其他字段也轉換,但存儲在相同的類型。爲什麼只有浮球? – Morrowless