Question

Je suis en train d'entrer dans un chemin de fichier dans quelques fichiers .pref, mais au lieu d'une chaîne, le champ veut une sorte de séquence hexadécimaux. Comment puis-je convertir mon chemin dans ce format hexadécimal?

Mac OS 10.6.7

Voici un exemple d'un emplacement de fichier:

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

Était-ce utile?

La solution

données de la 'alis' alias, qui a été le moyen standard pour se référer à des fichiers de manière persistante sous Mac OS depuis 20 ans ou plus. ;-) Le et de AliasHandle. al se trouvent dans Aliases.h, qui est dans le CarbonCore.framework du cadre général de CoreServices.

Notez qu'il est Property List Editor (ou Xcode) qui est en vous montrant une représentation hexadécimale de NSData. Les données nous dit que vous ne l'avez pas changé le nom de votre disque dur (il semble être encore « Macintosh HD ») et que le chemin de l'alias était à /Users/rcharette/inbox

Le nom « dernier cri » pour c'est des données de signet, qui a été introduit en 10.6.

Il y a quelques emballages de haut niveau autour des alias, le NDAlias de Nathan Day, je crois.

Dans le cas contraire, ce qui suit est à moi, une catégorie sur NSString calquée sur les nouvelles API de signets disponibles dans NSURL (qui nécessitent 10.6). (Ce code devrait fonctionner sur 10.3 +):

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

Dans le cas contraire, si vous pouvez demander 10.6, puis vérifier les nouvelles API dans NSURL.

Autres conseils

Les chemins dans les fichiers de préférence sont parfois codé en base64. Vous pouvez utiliser OpenSSL pour de / encoder les valeurs:

Décodage : echo <encoded-path> | openssl enc -d -base64

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top