Индекс или диапазон второго числа байтов в файле

#swift #macos

#swift #macos

Вопрос:

Я пытаюсь найти второе появление байтового шаблона в файле. Я могу успешно найти первое с помощью:

let mtrkChunk = Data(bytes: [0x4D, 0x54, 0x72, 0x6B] as [UInt8], count: 4) и затем let mtrkChRng = data.range(of: mtrkChunk)

Но не могу понять, как сделать так, чтобы он соответствовал второму появлению. Любая помощь, как всегда, будет оценена

Комментарии:

1. Вы ищете второе или последнее событие? Существует несоответствие между заголовком вашего вопроса и телом вопроса.

2. Моя вина. Теперь изменил его, как должно быть вторым.

3. похоже, что функция range принимает параметр index. Таким образом, вы должны быть в состоянии взять mtrkChRng, продвинуть его на единицу и использовать это. data.range(of: mrtrkChunk, in: mtrkChRng) что-то вроде

4. @estabroo Спасибо. Проверит это

Ответ №1:

Вы можете найти второе вхождение таким образом :

 if let rg1 = data.range(of: mtrkChunk),
    let rg2 = data[rg1.upperBound...].range(of: mtrkChunk) {
    print(rg2)   
}
 

Комментарии:

1. Спасибо. Я думал о чем-то подобном, но просто задавался вопросом, есть ли у swift что-то более удобное. Теперь я знаю 🙂

2. @ChrisBarrett Существует множество операций String , которые вы хотели бы изменить таким образом, чтобы они применялись только к части строки. Встраивание этого в каждую из этих операций привело бы к массовому раздуванию API (представьте себе добавление drop(while, skipping:) , shuffle(from:,to:) аналоги drop(while:) shuffle() , и т.д.). Вместо этого ответственность за нарезку строк была извлечена в строковые фрагменты (err, Substring ), на которых вы можете выполнять эти операции. Это делает весь API более компактным и предсказуемым (no1 никогда не забудет добавить from / to args , потому что они никогда не понадобятся)

Ответ №2:

Посмотрите на параметры

 let mtrkChRng = data.range(of: mtrkChunk, options: .backwards)