Как я могу преобразовать сжатый файл .gz, который я получаю с устройства Bluetooth с низким энергопотреблением, в настоящий распакованный файл в Swift 4.2, используя gzip? - PullRequest
1 голос
/ 27 марта 2019

Я очень новичок в Xcode и iOS, у меня есть устройство, назовем его Brains, к которому я подключаюсь через Bluetooth LE с помощью приложения, которое я создал с помощью Swift 4 и Xcode 10 на моем iPhone 5, назовите его Body,Мозги похожи на плату arduino, но не совсем.Я могу без проблем подключиться и получить все данные с помощью BLE, пока не попробую получить сжатый файл, заполненный строками json.Я получаю сжатые байты, но не могу понять, что делать дальше.Как я могу получить сжатый файл, распаковать его и прочитать данные внутри?

Я пробовал много вещей с помощью модулей: GzipSwift , DataCompression и SSZipArchive

Я использовал gunzipped (), gunzip () и depress (), но, похоже, ни один из них не работает.

Я читал эту ветку: iOS:: Как распаковать файл .gz с помощью GZIP Utility? и он говорит, что мне нужно получить весь сжатый поток байтов и преобразовать его в NSData, а затем распаковать его, проблема в том, что он использует target-c, и я не могу перевестив swift 4.

Я получаю байты от характеристики Bluetooth LE в массиве [UInt8], в этой функции:

    func received_logs(data: [UInt8]) {

    let data_array_example = [31, 139, 8, 8, 16, 225, 156, 92, 2, 255, 68, 97, 116, 97, 0, 181, 157, 107, 110, 220, 56, 16, 6, 175, 226, 3, 248, 71, 63, 73, 234, 44, 193, 222, 255, 26, 171, 30, 35, 192, 90, 20, 18, 121, 182, 11, 112, 16, 35, 48, 10, 31, 154, 197, 22, 135, 34, 227, 95, 191, 76, 244, 16, 183, 248, 252, 48, 137, 229, 38, 242, 249, 161, 231, 87, 156, 127, 207, 113, 126, 227, 159, 31, 231, 183, 110, 223, 255, 200, 239, 47, 203, 252, 253, 173, 255, 231, 159, 235, 235, 108, 105, 110, 101, 48, 47, 50, 48]

    for data_byte in stride(from: 0, to: data_array_example.count, by: 1) {
        let byte = String(data_array_example[data_byte])
        sourceString = sourceString + byte //getting all the bytes and converting to string to store in a variable
    }
    /******************************************************************/
    let text = sourceBuffer
    do {
        try text.write(to: path!, atomically: false, encoding: String.Encoding.utf8)
    }
    catch {
        print("Failed writing")
    } //dump the var into a txt file
    /**********UPDATED**********/
    var file_array : [UInt8] = []
    let byte2 = NSData(data: data_array_example.data)
    let asc_array = Data(bytes: byte2.data)
    let decompressedData: Data
    do {
        try decompressedData =  asc.gunzipped()
        print("Decom: ", String(data: decompressedData, encoding: .utf8))
    }
    catch {
        print(error) //Gives me the "unknown compression method error"
    }
}

Я ожидаю увидеть содержимое несжатого файла, ноЯ получаю только:

GzipError(kind: Gzip.GzipError.Kind.data, message: "incorrect header check")

Может быть, я просто усложняю, чем нужно.Любая помощь будет принята с благодарностью!

Большое спасибо:)

ОБНОВЛЕНИЕ: Я создал файл .gz и использовал и gunzipped (), и gunzip () и оба они работали.

ОБНОВЛЕНИЕ:

Попытка напрямую преобразовать данные в NSData и затем gunzip (), но теперь получаю ошибку:

GzipError(kind: Gzip.GzipError.Kind.data, message: "unknown compression method")

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Я решаю свою проблему.Оказывается, я неправильно подсчитывал байты, и некоторые из них были в неправильном порядке.Спасибо вам, ребята, за помощь!

0 голосов
/ 28 марта 2019

Обновленные данные примера имеют правильный заголовок gzip, и поэтому не будут давать вам неверную проверку заголовка, если вы правильно подаете данные в gunzipper.

...