0 votos

Cómo decodificar/descomprimir las notas de vCard de Apple

Tengo vCards que fueron exportadas desde la aplicación de Contactos de Mac OS X 10.8.2. Por lo que puedo ver, Apple exportó las notas con RTF que fue comprimido con LZF y convirtió los datos comprimidos a base 64 antes de exportar la vCard. Estoy tratando de restaurar una exportación pero la versión actual (Sonoma 14.2.1) ignora el campo de notas de la vCard. (He eliminado la información de contacto pero no he tocado la sección X-APPLE-OL-NOTE.)

Aquí tienes un ejemplo de vCard:

BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//Mac OS X 10.8.2//ES
N:;Jane;;;(Baker) Smith
FN:Jane (Baker) Smith
TEL;type=HOME;type=VOICE;type=pref:(123) 123-4567
TEL;type=CELL;type=VOICE:(321) 321-7654
item1.ADR;type=HOME;type=pref:;;123 Any Street;Any Town;XX;T1T 1T1;Canada
item1.X-ABADR:ca
UID:CZTL-07DB0A0E-002E-0202-FF32-00816
X-ABUID:6EB029FB-BBBB-4242-A054-C5F4392245BD:ABPerson
X-EVOLUTION-FILE-AS:Smith, Jane
X-APPLE-OL-MAPPING-INFO:1
X-APPLE-OL-NOTE;TYPE=text/rtf;X-COMPRESSION=X-OL;X-HASH=03c582c83054be62e05
e09df57aff23b;X-HASHALGORITHM=X-zMD5;ENCODING=B:fAAAAI0AAABMWkZ1YU/S1F8AAwF
AAHIB9wK3VgSQZC0AcGECgAqScASQdzEYMTA0AUAPc2g5OIYwAUAAwRJnbDEMAd0Q4nIRMgsDDN
A1DAEM0F0P4DYC0QoRAUBpAUB1VGxuAiBlAgBjAUBjAQu1IChBYnJhaGBhbXNlKQ9AFcA=
END:VCARD

La nota en la vCard anterior es "(Abrahamse)".

He intentado leer la Nota con el siguiente código Swift (la vCard anterior está almacenada en disco como test.vcf):

import Foundation
import Contacts

func readVCard(filePath: String) {
    do {
        // Leer el contenido del archivo vCard
        let vCardContent = try String(contentsOfFile: filePath, encoding: .utf8)

        // Analizar los datos de la vCard
        if let data = vCardContent.data(using: .utf8) {

            let contacts = try CNContactVCardSerialization.contacts(with: data)

            // Imprimir información de cada contacto
            for contact in contacts {
                print("Identificador de Contacto: \(contact.identifier)")
                print("Nombre: \(contact.givenName)")

                for phoneNumber in contact.phoneNumbers {
                    print("Número de Teléfono: \(phoneNumber.value.stringValue)")
                }

                print("Notas: \(contact.note)")
            }
        }
    } catch {
        print("Error al leer el archivo vCard: \(error.localizedDescription)")
    }
}

// Uso de ejemplo: reemplaza "test.vcf" con la ruta real a tu archivo vCard
let vCardFilePath = "test.vcf"
readVCard(filePath: vCardFilePath)

El resultado de ejecutar el código es el siguiente -- la información de la nota no se extrae correctamente:

Identificador de Contacto: 2035C9D6-6A76-49F4-A5ED-C2C073A517CE:ABPerson
Nombre: Jane
Número de Teléfono: (123) 123-4567
Número de Teléfono: (321) 321-7654
Notas: 
Programa finalizado con código de salida: 0

Usé el comando base64 en la terminal para decodificar las notas de 2 vCards y los primeros bytes fueron (de xxd):

test.vcf: 00000000: 7c00 0000 8d00 0000 4c5a 4675 614f d2d4 |.......LZFuaO..  
second.vcf: 00000000: 5e1f 0000 4f4e 0000 4c5a 4675 59f1 0eeb ^...ON..LZFuY...

Entonces, la superposición principal es 4c5a 4675, correspondiente a LZFu. No pude emparejar eso con las pistas en la página Identifying Compression Algorithms.

¿Cómo podría extraer la nota correctamente?

1voto

Steve Evans Puntos 155

Experimenta con CyberChef para decodificar desde Base64 y luego examinar el resultado de manera interactiva. Esto debería ser más fácil que escribir en Swift.

El Base64 decodificado incluye los caracteres LZW pero parece incluir un encabezado que necesita ser eliminado, consulta Identificar Algoritmos de Compresión para sugerencias de codificación.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X