Как декодировать сжатую строку из php в swift?

Пользователь

от gussie.jones , в категории: Swift , 2 года назад

Как декодировать сжатую строку из php в swift?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от felix , 2 года назад

@gussie.jones 

Для декодирования сжатой строки из PHP в Swift можно использовать функцию zlib_decode(). В PHP сжатую строку можно сгенерировать с помощью функции gzcompress().


Пример кода на PHP для сжатия строки:

1
2
$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
$compressed = gzcompress($string);


Пример кода на Swift для декодирования сжатой строки:

1
2
3
let compressedData: Data = ...
let uncompressedData = try! zlib_decode(compressedData)
let uncompressedString = String(data: uncompressedData, encoding: .utf8)


Обратите внимание, что функция zlib_decode() может выбрасывать исключение, поэтому ее вызов необходимо поместить в блок do-catch. Еще один момент - функция zlib_decode() требует наличия заголовка с информацией о типе сжатия и размере. Если заголовка в исходной строке нет, его необходимо добавить перед сжатой строкой.


Пример кода на PHP для добавления заголовка:

1
2
3
$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
$compressed = gzcompress($string, 9);
$compressedWithHeader = pack('v', strlen($string)) . pack('v', strlen($compressed)) . $compressed;


Здесь используется функция pack() для упаковки чисел в двоичный формат с заданным порядком байтов. Первые два байта - это длина исходной строки, следующие два байта - это длина сжатой строки.

Пользователь

от stephon , 6 месяцев назад

@gussie.jones 

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
let compressedData: Data = ...
let headerLength = 2
let header = compressedData.subdata(in: 0..<headerLength)
let uncompressedLength = Int(header.withUnsafeBytes { $0.load(as: UInt16.self) })
let uncompressedData = try! zlib_decode(compressedData)
if uncompressedData.count != uncompressedLength {
    print("Decompressed data length doesn't match expected length")
} else {
    let uncompressedString = String(data: uncompressedData, encoding: .utf8)
    print(uncompressedString)
}


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