Ruta de hex de archivo Mac .pref
-
26-10-2019 - |
Pregunta
Estoy tratando de ingresar una ruta de archivo en algunos archivos .pref, pero en lugar de una cadena, el campo quiere algún tipo de secuencia hexadecimal. ¿Cómo puedo convertir mi camino en este formato hexadecimal?
Mac OS 10.6.7
Aquí hay un ejemplo de ubicación de archivo:
<00000000 009e0003 00010000 c94bbb14 0000482b 00000000 000d3ad2 000dfc12 0000c950 e4db0000 00000920 fffe0000 00000000 0000ffff ffff0001 0008000d 3ad2000c 9ce1000e 000c0005 0069006e 0062006f 0078000f 001a000c 004d0061 00630069 006e0074 006f0073 00680020 00480044 00120015 55736572 732f7263 68617265 7474652f 696e626f 78000013 00012f00 00150002 0010ffff 0000>
Solución
Es alias 'alis'
Los datos, que han sido la forma estándar de referirse a los archivos de manera persistente en Mac OS durante los últimos 20 años o más. ;-) Los AliasHandle
Et. Al se encuentran en Aliases.h
, que esta en el CarbonCore.framework
del CoreServices
marco paraguas.
Tenga en cuenta que es el editor de la lista de propiedades (o xcode) que le muestra una representación hexadecimal de NSData
. Los datos nos dicen que no ha cambiado el nombre de su disco duro (parece ser "Macintosh HD") y que la ruta del alias era /Users/rcharette/inbox
El nombre "Newfangled" para esto son los datos de marcadores, que se introdujeron en 10.6.
Hay un par de envoltorios de alto nivel alrededor de alias, Nathan Day's NDAlias
, Yo creo.
De lo contrario, lo siguiente es mío, una categoría en NSString
modelado después de las nuevas API de marcador disponibles en NSURL
(que requieren 10.6). (Este código debería funcionar en 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
De lo contrario, si puede necesitar 10.6, consulte las API más nuevas en NSURL
.
Otros consejos
Las rutas en los archivos de preferencia a veces están codificadas Base64. Puede usar OpenSSL para codificar los valores:
Descodificar: echo <encoded-path> | openssl enc -d -base64
Codificar: echo <path> | openssl enc -e -base64