Массив байтов декодирования Objective-C на основе ключа

Я относительно новичок в target-c, и эта проблема на некоторое время поставила меня в тупик до такой степени, что я даже не хочу использовать кодирование. Я работаю с аудиофайлами, к которым применяется базовая форма кодирования замены байтов на байты. Чтобы эти файлы работали в моем приложении, я должен их декодировать, но мои попытки не увенчались успехом.

Для декодирования файлов мне был предоставлен ключ, который выглядит следующим образом:

static const short key[256] = {
      2,  93,   6, 134,   8, 200,  79, 236, 155, 242,
      4, 241,  59, 143, 153, 196, 118,  20, 105, 109,
    209, 149,  74, 177, 201,  81,  17,  62,  27, 183,
    103,  90, 220,   1, 224, 211, 207,  34,  24, 182,
     58,  91, 204,  73, 214,  65, 131,  75,  33,  80,
     50, 146, 139,  86, 254, 219,  76, 138, 179,  96,
    184, 166, 212, 178,  16, 193, 186, 150,  22,  40,
     19, 151, 120,  35,  26, 218, 221, 133, 127, 190,
    245, 225, 164,  47, 124,  95,  21, 255, 123, 237,
    162,  97, 115, 234,  46, 206, 185, 216,  85, 240,
     66, 229,  13,  43, 102, 154, 169,  92, 253,  54,
     44, 192, 126,  61, 247,  56, 194, 167,  10,  36,
    248, 223, 238, 121, 217,  14, 137, 147,  49, 152,
    141,  23,  25, 114, 246, 168,  55,  57, 181,   5,
    215,  60,  87, 100, 210, 163, 122, 113,  28,  68,
     53, 144, 135, 180,  38,  12, 157,  31, 202, 112,
    161, 239,  29,  98, 233, 230, 125, 111, 227,  52,
    189, 174,  30,  78,  88,  39, 213, 232,   7,  41,
    199,  15, 208,  94, 106, 145,  64, 191,  71, 132,
    173,   3, 205, 171, 101, 110, 172, 244, 249, 188,
    130, 235, 222, 195, 230,  18,  32, 250,  72, 170,
    198, 156, 251,  63, 117, 136, 252,  70, 158,  82,
    142, 176, 175, 107,  45, 119, 116,  83,  89,  69,
     42, 231,   0, 128,  37, 228,  84,  48,  99, 148,
    197, 243, 226, 129,  77,  67, 187, 108, 159,  11,
    165, 160,  51,   9, 104, 140
};

Файл имеет собственный заголовок и некоторые добавленные данные в конце, которые я должен игнорировать, поэтому я делаю следующее после открытия закодированного файла и помещаю его в массив байтов:

[file seekToFileOffset:128];
databuffer = [file readDataToEndOfFile];

NSMutableData *audioData =
      [[[NSMutableData alloc] initWithData:databuffer] autorelease];
[audioData setLength:[audioData length]-8];

//Put encoded data into byte array
Byte *audioBytes = (Byte *)malloc([audioData length]);
[audioData getBytes:audioBytes];

Я могу получить доступ к байтам следующим образом:

UInt8 firstByte = audioBytes[0];
UInt8 secondByte = audioBytes[1];
etc...

Моя попытка декодирования данных выглядит примерно так:

Byte *decodedData;
NSMutableData *audioDataToPlay = [[[NSMutableData alloc] init] autorelease];
UInt8 currentByte;            

for(int x=0; x<[audioData length]; x++){
    currentByte = audioBytes[x];
    Byte *bytes = (Byte*) &currentByte;

    decodedData = [self unreplace:bytes];

    //Hopefully unencoded data...
    [audioDataToPlay appendBytes:decodedData length:sizeof(decodedData)];
}

Функция замены выглядит так:

+(Byte *)unreplace:(Byte *)bytes{
    int size = sizeof(key);

    Byte *inverseKey = (Byte *)malloc(size);

    for(int position = 0; position < size; position++)
    {
        for(int index=0; index < size; index++)
        {
            if(key[index] == position)
            {
                inverseKey[position] = index;
                break;
            }
        }
    }

    size = sizeof(bytes);
    Byte *unreplaced = (Byte *)malloc(size);

    for(int index=0; index <size; index++)
    {
        unreplaced[index] = inverseKey[bytes[index]];
    }
    return unreplaced;
}

Я уверен, что этот код имеет некоторые серьезные проблемы. Это была моя попытка портировать код C# на Objective-C. Кажется, что байты подменяются, но это очень медленно. Через 10 минут он достигает около 100 000+ байт и в конечном итоге падает из-за нехватки памяти. Я знаю, что в какой-то момент malloc нужно освободить. Каждый файл имеет размер от 3 МБ до 10 МБ, и я полагаю, что операция займет всего несколько секунд, но мой код явно плохой.


person zfunke    schedule 20.09.2011    source источник
comment
Вероятно, здесь это не так уж и важно, но FWIW вам, вероятно, следует воздерживаться от публичного размещения фактических ключевых материалов, подобных этому. Я предполагаю, что вы несколько рандомизировали его :)   -  person Ben Zotto    schedule 21.09.2011
comment
Проблема, очевидно, логическая, не могли бы вы добавить несколько комментариев к методу unplace и к предыдущему фрагменту кода? Так я, вероятно, смогу вам помочь.   -  person El Developer    schedule 21.09.2011


Ответы (1)


  • Выделение объекта NSMutableData и заполнение его databuffer… только для того, чтобы уменьшить длину NSData и, наконец, затем извлечь байты из этого объекта NSMutableData, вероятно, бесполезно: вы, вероятно, можете получить доступ к байтам databuffer напрямую… и остановиться, когда достигнете len-8?

  • Но что более важно, вы должны инвертировать массив key только один раз и, вероятно, сделать это во время компиляции. Поскольку массив key является статическим, жестко закодированным массивом (мы называем его LUT или справочной таблицей, если это имеет значение), массив inverseKey всегда будет иметь одни и те же значения каждый раз, когда вы запускаете свою программу, поэтому его жесткое кодирование также ускорит ваш код. слишком.

Наконец, я призываю вас использовать Инструменты и его инструменты «Производительность» и бенчмаркинга, это поможет вам найти часть вашего кода, выполнение которой занимает все это время, и вам будет очень легко определить правильный место в коде, чтобы оптимизировать вещи.

person AliSoftware    schedule 20.09.2011