1

私は NSData オブジェクトのサブデータを取得しようとしていますが、同時に複数のバイトを自分の個人的なニーズのために何らかの値で取得しようとしています。

実際、これは .wav サウンド ファイルの音量に影響します。

しかし、次の関数を数回呼び出した後、malloc ステートメントで malloc エラーが発生します。

+(NSData *) subDataOfData: (NSData *) mainData withRange:(NSRange) range volume (CGFloat) volume
{
    // here is the problematic line:
    Byte * soundWithVolumeBytes = (Byte*)malloc(range.length); 
    Byte * mainSoundFileBytes =(Byte *)[mainData bytes];

    for (int i=range.location ; i< range.location + range.length; i=i+2)
    {
        // get the original sample
        int16_t sampleInt16Value = 0;
        sampleInt16Value = (sampleInt16Value<<8) + mainSoundFileBytes[i+1];
        sampleInt16Value = (sampleInt16Value<<8) + mainSoundFileBytes[i];

        //multiple sample 
        sampleInt16Value*=volume;

        //store the sample
        soundWithVolumeBytes[i] = (Byte)sampleInt16Value;
        soundWithVolumeBytes[i+1] =(Byte) (sampleInt16Value>>8);

    }


    NSData * soundDataWithVolume = [[NSData alloc] initWithBytes:soundWithVolumeBytes length:range.length];
    free(soundWithVolumeBytes);

    return [soundDataWithVolume autorelease];

}

ありがとう !!

4

1 に答える 1

2

の値がrange.locationゼロ以外の場合、forループは割り当てられた場所を超えて場所を変更します。これらの行

soundWithVolumeBytes[i] = ...
soundWithVolumeBytes[i+1] = ...

range.locationからまでの場所に書き込みますrange.location+range.length-1が、割り当てられる範囲は 0 から までのみですrange.length。行を次のように変更する必要があります

soundWithVolumeBytes[i-range.location] = ...
soundWithVolumeBytes[i+1-range.location] = ...

range.location+range.lengthさらに、2 ずつインクリメントするため、奇数の場合、最後の反復でバッファの末尾を超えて 1 バイトアクセスする可能性があります。

于 2013-02-25T13:40:47.680 に答える