2010-11-02 2 views
1

У меня есть байтовый массив (скажем, UInt8 * somebuffer) с данными в неизвестном формате. Я пробовал кастинг по нескольким типам данных и не добился успеха в получении каких-либо значимых данных. То, что я пытаюсь сделать, это что-то вроде:Получение значений из массива байтов (UInt8) в C

float * floatArray = somebuffer;

, а затем работать с содержимым как поплавок, и я также пробовал с несколькими другими, такими как int и double. Кастинг таким образом достаточен для доступа к данным, хранящимся как разные типы? Например, float будет индексом 0-3 в массиве байтов, но должен быть индексом 0 в массиве float, правильно?

Как в стороне это случается линейный PCM аудиоданных, вот настройки, которые я использую для генерации данных PCM (я пытаюсь получить уровни от ИКМ-данные для генерации сигнала):

[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; 
    [recordSetting setValue:[NSNumber numberWithFloat:22000.0] forKey:AVSampleRateKey]; 
    [recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey]; 

    [recordSetting setValue:[NSNumber numberWithInt:8] forKey:AVLinearPCMBitDepthKey]; 
    [recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 
    [recordSetting setValue:[NSNumber numberWithBool:YES] forKey:AVLinearPCMIsFloatKey]; 
+0

подробнее необходимо: что бит глубина данных PCM, стерео/моно, или то, что вы пытаетесь делать? – user318904

+0

PCM обычно использует целые числа 8/16/20/24 бит и не плавает и может быть сжатым в зависимости от формата. – uesp

+0

Я указываю 16 бит, моно, 22000khz, но играл с этими настройками (я записываю с iPhone mic) и до сих пор не получаю резонансные данные. Я указываю данные float, но также попытался целое число. Данные Float указаны как -1 к 1, но все значения, которые я получаю, либо случайны, либо очень близки к 0 (т. Е. 0,00002, -0,00003) – John

ответ

1

Да, этого достаточно, если вы набрали правильный формат. Ваше рассуждение верно, но чтобы избавиться от предупреждений компилятора, я хотел бы сделать бросок, как:

float floatArray = (float*)someBuffer;

+0

И не забудьте запомнить, что количество элементов в массиве будет соответственно снижаться тоже (массив размером 100 'byte' будет содержать только 25' float') – user470379

+0

Есть ли другие соображения? Например, я знаю, что конечность имеет значение, но я заметил, что, читая статью wikipedia о поплавках, существует множество способов представления float. – John

Смежные вопросы