Frage

Ich versuche, einen Dateipfad in ein paar .pref-Dateien einzugeben, aber statt einer Zeichenfolge möchte das Feld eine Art Hexadezimalfolge enthalten.Wie kann ich meinen Pfad in dieses Hex-Format konvertieren?

Mac OS 10.6.7

Hier ist ein Beispiel für einen Dateispeicherort:

<00000000 009e0003 00010000 c94bbb14 0000482b 00000000 000d3ad2 000dfc12 0000c950 e4db0000 00000920 fffe0000 00000000 0000ffff ffff0 001 0008000d 3ad2000c 9ce1000e 000c0005 0069006e 0062006f 0078000f 001a000c 004d0061 00630069 006e0074 006f0073 00680020 0048 0044 00120015 55736572 732f7263 68617265 7474652f 696e626f 78000013 00012f00 00150002 0010ffff 0000>

War es hilfreich?

Lösung

Es ist ein Alias 'alis' Daten, was in den letzten 20 Jahren oder länger die Standardmethode war, um in Mac OS dauerhaft auf Dateien zu verweisen.;-) Der AliasHandle et.Alle sind in zu finden Aliases.h, das ist in der CarbonCore.framework des CoreServices Regenschirmrahmen.

Beachten Sie, dass es der Eigenschaftenlisten-Editor (oder Xcode) ist, der Ihnen eine hexadezimale Darstellung von anzeigt NSData.Aus den Daten geht hervor, dass Sie den Namen Ihrer Festplatte nicht geändert haben (er scheint immer noch „Macintosh HD“ zu sein) und dass der Pfad des Alias ​​lautete /Users/rcharette/inbox

Der „neumodische“ Name dafür ist Bookmark Data, der in 10.6 eingeführt wurde.

Es gibt ein paar High-Level-Wrapper für Aliase, den von Nathan Day NDAlias, Ich glaube.

Ansonsten ist das Folgende meine, eine Kategorie weiter NSString Nach dem Vorbild der neuen Lesezeichen-APIs, die in verfügbar sind NSURL (die 10.6 erfordern).(Dieser Code sollte auf 10.3+ funktionieren):

MDBookmarks.h:

#import <Foundation/Foundation.h>

//  Constants
//  MDBookmarkResolutionWithoutUI
// Option for specifying that no UI feedback accompany resolution of the bookmark data.
enum {
    MDBookmarkResolutionDefaultOptions      = 1,
    MDBookmarkResolutionWithoutUI = ( 1UL << 8 )
};
typedef NSUInteger MDBookmarkResolutionOptions;


@interface NSString (MDBookmarks)

- (NSData *)bookmarkDataWithError:(NSError **)error;

+ (id)stringByResolvingBookmarkData:(NSData *)bookmarkData 
                            options:(MDBookmarkResolutionOptions)options
       bookmarkDataIsStale:(BOOL *)isStale error:(NSError **)error;

@end

MDBookmarks.m:

#import "MDBookmarks.h"
#import <CoreServices/CoreServices.h>
#import <sys/syslimits.h>

@implementation NSString (MDBookmarks)

- (NSData *)bookmarkDataWithError:(NSError **)outError {
    if (outError) *outError = nil;
    NSString *path = [[self stringByResolvingSymlinksInPath]
                               stringByStandardizingPath];
    AliasHandle alias = NULL;
    FSRef itemRef;
    OSStatus status = FSPathMakeRef((const UInt8 *)[path UTF8String], &itemRef, NULL);
    if (status != noErr) {
        if (outError) {
            if (status == fnfErr) *outError = [NSError errorWithDomain:NSCocoaErrorDomain 
              code:NSFileNoSuchFileError userInfo:nil];
            else *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
              code:status userInfo:nil];
        }
        return nil;
    }
    status = FSNewAlias(NULL, &itemRef, &alias);
    if (status != noErr ) {
        if (outError)
        *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
                code:status userInfo:nil];
        return nil;
    }
    HLock((Handle)alias);
    NSData *bookmarkData =
[[[NSData dataWithBytes:*alias length:GetHandleSize((Handle)alias)] retain] autorelease];
    HUnlock((Handle)alias);
    if (alias) DisposeHandle((Handle)alias);
    return bookmarkData;
}

+ (id)stringByResolvingBookmarkData:(NSData *)bookmarkData
        options:(MDBookmarkResolutionOptions)options
         bookmarkDataIsStale:(BOOL *)isStale error:(NSError **)outError {
    if (bookmarkData == nil) return nil;
    if (outError) *outError = nil;
    AliasHandle alias = NULL;
    FSRef resolvedRef;
    Boolean wasChanged = false;
    OSStatus status = PtrToHand([bookmarkData bytes], (Handle *)&alias,
                                              [bookmarkData length]);
    if (status) {
        if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
                         code:status userInfo:nil];
        return nil;
    }
    status = FSResolveAliasWithMountFlags(NULL, alias, &resolvedRef, &wasChanged,
             (options & MDBookmarkResolutionWithoutUI ? kResolveAliasFileNoUI : 0));
    if (status) {
        if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain
                            code:status userInfo:nil];
        return nil;
    }
    UInt8 thePath[PATH_MAX + 1];
    status = FSRefMakePath(&resolvedRef, thePath, PATH_MAX);
    if (status != noErr) {
        if (outError) *outError = [NSError errorWithDomain:NSOSStatusErrorDomain 
                        code:status userInfo:nil];
        return nil;
    }
    if (isStale) *isStale = wasChanged;
    return [NSString stringWithUTF8String:(const char *)thePath];
}
@end

Andernfalls, wenn Sie 10.6 benötigen, schauen Sie sich die neueren APIs an NSURL.

Andere Tipps

Pfade in Präferenzdateien werden manchmal base64 codiert. Sie können OpenSSL verwenden, um die Werte zu de/codieren:

Dekodieren: echo <encoded-path> | openssl enc -d -base64

Kodieren: echo <path> | openssl enc -e -base64

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top