簡體   English   中英

NSCoder編碼和解碼的c數據類型

[英]NSCoder encoding and decoding of c data type

我正在和應用程序將音頻傳輸到接收服務器。 我想對音頻緩沖區進行編碼以便流式傳輸。 我做了一個存儲該緩沖區和其他信息的類。 在對主要對象進行編碼后對數據進行解碼時,這兩個對象具有不同的音頻緩沖區。

所以結論是我在編碼/解碼中犯了一個錯誤。 這是我編碼緩沖區的代碼

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeBytes:&_data length:sizeof(float *)];
    [aCoder encodeInt:_numFrames forKey:numFrames];
    [aCoder encodeInt:_numChannels forKey:numChannels];
}

注意 _data具有(float *) c數據類型

解碼邏輯在這里

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {

        NSUInteger length = 0;
        {
            const uint8_t *buffer = [aDecoder decodeBytesForKey:data returnedLength:&length];
            assert(length);
            memcpy(&_data, buffer, length);
        }
        _numFrames = [aDecoder decodeInt32ForKey:numFrames];
        _numChannels = [aDecoder decodeInt32ForKey:numChannels];
    }
    return self;
}

我正在使用此方法比較它們是否相同

- (BOOL)isEqual:(id)object {
    AudioPacket *compareObject = (AudioPacket *)object;
    return (_data == compareObject.data && _numFrames == compareObject.numFrames && _numChannels == compareObject.numChannels);
}

不確定,但是在編碼_data您沒有給它一個密鑰:

[aCoder encodeBytes:&_data length:sizeof(float *)];

解碼_data您使用密鑰data

 const uint8_t *buffer = [aDecoder decodeBytesForKey:data returnedLength:&length];

也許您想要一個也需要一個密鑰的encodeBytes版本

 encodeBytes:length:forKey:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM