Как дифференцировать типы данных в обработчике завершения Swift URLSession? [Дубликат]

Вам нужно только количество завершенных 7-дневных интервалов с первой записи?

dvec <- as.Date("2001-04-01")+0:90
dweek <- as.numeric(dvec-dvec[1]) %/% 7
dweek[1:21]
# [1] 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2
17
задан blee908 14 February 2014 в 23:23
поделиться

5 ответов

Насколько я знаю, NSData - это просто объект данных, который обертывает массив байтов:

https://developer.apple.com/library/mac/documentation/ Cocoa / Reference / Foundation / Classes / NSData_Class / Reference / Reference.html

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

Я также нашел это: Определить тип MIME NSData, загруженный из файла ; который относится к некоторой внутренней базе данных (я думаю), которая может использоваться для поиска типа MIME.

Но, как говорит Том Харрингтон в своем ответе, это может стать сложным в зависимости от того, с чем вы имеете дело.

Изменить ...

Конечно, это второе решение зависит от расширения файла, которого у вас явно нет, но я уверен, что вы это уже заметили.

29
ответ дан Community 22 August 2018 в 20:47
поделиться
  • 1
    Спасибо за ответ! – blee908 15 February 2014 в 00:02
  • 2
    Эй @ blee908, это может быть верным ответом, как вы думаете? :) – Tib 4 July 2016 в 09:37
  • 3
    Как мы можем обнаружить аудиофайлы? – Ankush 21 September 2016 в 12:20
  • 4
    @Ankush проверяет список подписей, как указано выше ru.wikipedia.org/wiki/List_of_file_signatures – Tib 23 September 2016 в 12:23
  • 5
    затем найдите типы аудиофайлов, которые вы хотите обнаружить, и случай для каждого типа файла. Пример: согласно массиву сигнатур файлов, первый байт WMA равен 0x30, поэтому добавьте случай 0x30: return @ "audio / x-ms-wma"; ломать; – Tib 23 September 2016 в 12:28

❤️ Swift

extension Data {
    private static let mimeTypeSignatures: [UInt8 : String] = [
        0xFF : "image/jpeg",
        0x89 : "image/png",
        0x47 : "image/gif",
        0x49 : "image/tiff",
        0x4D : "image/tiff",
        0x25 : "application/pdf",
        0xD0 : "application/vnd",
        0x46 : "text/plain",
        ]

    var mimeType: String {
        var c: UInt8 = 0
        copyBytes(to: &c, count: 1)
        return Data.mimeTypeSignatures[c] ?? "application/octet-stream"
    }
}
14
ответ дан Dmitry Isaev 22 August 2018 в 20:47
поделиться

Поскольку вы говорите, что вы загружаете эти данные, вы уже должны знать тип MIME. Вы создали объект данных, вы знаете, откуда пришли данные, и существует ограниченное количество типов MIME. Поэтому используйте то, что применимо к вашим данным. Для изображения это, вероятно, image/jpeg или image/png. Для видео есть куча типов video/. Вы можете найти длинный список строк типа MIME на вашем Mac в /etc/apache2/mime.types. Вы захотите, чтобы один или несколько из них зависели от того, какое видео вы имеете.

Определение типа MIME является липкой проблемой; NSData может кодировать любые двоичные данные. Единственный способ определить, что было закодировано, - это изучить байты. Это, в свою очередь, означает некоторое понимание того, какие потоки байтов существуют в разных типах файлов. Должно быть возможно использовать словарь поиска во многих (но не во всех) случаях, и может существовать реализация с открытым исходным кодом где-то для общих типов файлов. Чтобы узнать, что с этим связано, попробуйте man file на вашем Mac и посмотрите в /usr/share/file/magic/, чтобы узнать, как идентифицируются различные типы файлов (команда file не создает типы MIME, но она анализирует содержимое файла, чтобы попытаться определить типы файлов, так что это тот же принцип).

2
ответ дан Tom Harrington 22 August 2018 в 20:47
поделиться
  • 1
    Спасибо за объяснение. Ну, предыстория немного сложнее. Я пишу вызов API, и я не знаю, что передает пользователь. Все, что я знаю, это его класс NSData, и это может быть образ или видео. И мне нужно, чтобы тип MIME слишком правильно загружал файл через AFNetworking. – blee908 14 February 2014 в 23:37
  • 2
    Ваш сервер должен знать точный MIME-тип? Вы всегда можете вернуться к application/octet-stream, чтобы указать «какие-то двоичные данные». Если вам нужно что-то более конкретное, лучше всего загрузить его в класс AVFoundation (возможно, AVAsset), а затем посмотреть на метаданные, чтобы выбрать тип MIME. – Tom Harrington 14 February 2014 в 23:41
  • 3
    Очень близко. Оказывается, что «приложение / октет-поток» (я тестировал png и jpeg, но вводил один и тот же тип MIME), но AFNetworking должно знать расширение файла, поэтому вам нужно передать имя файла NSString * с именем «mypic.jpeg», или "mypic.png" не "mypic" – blee908 15 February 2014 в 00:01
  • 4
    Хорошо, ну, я не использую AFNetworking, поэтому я об этом не знаю. Это открытый исходный код, поэтому его изменение всегда является опцией. – Tom Harrington 15 February 2014 в 00:21

var values ​​= [UInt8] (повторяется: 0, count: imgData.count)

imgData.copyBytes (to: & amp; values, count: 1)

    switch values {
    case 0xff:
        return "image/jpeg"
    case 0x89:
        return "image/png"
    case 0x47:
        return "image/gif"
    case 0x49, 0x4d:
        return "image/tiff"
    }

    return ""
0
ответ дан Urvish Modi 22 August 2018 в 20:47
поделиться
30
ответ дан Community 5 November 2018 в 18:04
поделиться