【发布时间】:2011-12-08 06:15:49
【问题描述】:
我对 bridge 还是有点陌生,我正在玩 Lion (Mac OS 10.7) 上的新影子哈希,但遇到了障碍。下面的脚本 sn-p 以 root 身份运行时将嵌套的影子哈希显示为字典,但我想稍后在脚本中将此 NSData 用作字符串。我应该可以使用 NSString 方法对其进行转换,但是我收到了一个类型错误,我认为这与桥有关,而不是我的代码。
#!/usr/bin/python
from Cocoa import NSData,NSDictionary,NSPropertyListSerialization,NSString
from Cocoa import NSUTF8StringEncoding,NSPropertyListImmutable
user = 'foobarbaz'
path = '/var/db/dslocal/nodes/Default/users/%s.plist' % user
# Read the binary plist
plist = NSDictionary.dictionaryWithContentsOfFile_(path)
# Grab the ShadowHashData key
dataShadowHashData = plist['ShadowHashData'][0]
# Convert to dictionary
convertDataToPlist = NSPropertyListSerialization.propertyListWithData_options_format_error_(dataShadowHashData,NSPropertyListImmutable,None,None)
ShadowHashData = convertDataToPlist[0]
print ShadowHashData
for key in ShadowHashData.keys():
value = NSString.initWithData_encoding_(ShadowHashData[key],NSUTF8StringEncoding)
print type(value)
print '%s = %s' % (key,value)
我正在调用 NSString 的 initWithData 方法,它应该将我的 NSdata 转换为 NSUTF8StringEncoding 字符串。但是我收到一个类型错误:
Traceback (most recent call last):
File "./makehash.py", line 16, in <module>
value = NSString.initWithData_encoding_(ShadowHashData[key],NSUTF8StringEncoding)
TypeError: Expecting instance of NSString as self, got one of __NSCFData
我环顾四周,但由于在 python 中使用 NSData 类的情况非常罕见,所以我找不到这个错误的含义。语法对我来说是正确的。有人在这里看到任何明显的问题吗?
您可能可以从错误中看出,但如果它不明显
print type(ShadowHashData[key])
会告诉你:
<objective-c class __NSCFData at 0x7fff7ef54cc8>
另外,为了让你知道,我试过了:
value = NSString.alloc().initWithData_encoding_(ShadowHashData[key],NSUTF8StringEncoding)
但返回无
感谢您的帮助
你可以找到这个方法的类文档here
这是输出 打印 ShadowHashData
看起来像一个示例用户
{
"CRAM-MD5" = <f0a37234 5839f75e a9d98039 32e6124f 64e0e85a 31577d43 79d2415a 6d96f381>;
NT = <52735ecd 048506c2 60b3ed2a 4ba2c4c2>;
RECOVERABLE = <a3a037d2 0fce0cdb fb4f8158 6da43e0a 65e239cf 7d2216b0 7efdf8d2 1598fa8e ea4eaf00 c7a1a7be 7970cdf9 67102b15 926d1e48 c556cc12 a9285ea5 b31eda0c 4df2c9e4 af50c357 d2c3db46 093ed81d 817172a8 2d7278b7 3f760246 3b440d5a 2a812b5a 81b16db5 f1f4bdb9 c6232145 03e78548 d9c1f092 a7b64ee7 00b3d38d 14f0f6d3 1e2877a8 f06560e1 e184a051 77e7a9be 215cbfa7 6441194f 19982c2b f6afabc1 94cb1cb5 ba1a3e2f 8db170b5 9902d1ec bea60296 a461662f 3599eb8f b91e7905 3279e50d 9616e337 a5d01108 e0d4ec2b d5d8d539 f6780f63 9d298f02 9e57fb8b 330b12f8 ea796ae4 79006215 37b0221e 50f82a55 e202ccb6 e5e2989f 84334041 6fd3bd39 52adc7c9 856a38a0 549662f2 a51aaca6 a1c310ba ac3a0a70 56f3e34d 9fe7063b c3db765b 68a056ac 5a74a8c1 b988854c d647143e 685f470e a76ea2c4 4bf8d952 c8b1c584 a6a7a1c9 ae14ba0c d8038640 a6251836 a5f87ac7 aad7b41f 554fb452 74930645 0e781738 58c36eff ab5c7c6b 0716d951 5467681f e53fe494 67df923d 0cf39d57 36843350 e670c960 bc3ee5b1 d70b37dd 38afca2b c320b136 645122e1 3800c053 9cb927c4 b1ebba4b 23af2544 a86acebc 3927e12a 84e63104 1870a5f7 110fe408 48469da5 fbbdb5e7 fae08d29 07d474de 98088ebe cb845a8e 9679ffc4 db333c6b f8c29fdf aafab45b 7bf8678d b2aa8724 abdb824d>;
"SALTED-SHA512" = <3aef7ed2 355e259f cdb153ed 4f1c1d63 abff9438 7783dcc2 b282d620 91f247b7 835931e0 e331b5dc 3b46bdb5 f39f37d8 5ba0bfcc 521a0232 85a7e732 5eb362db acdc593d>;
}
【问题讨论】:
-
第一个错误表明您需要在调用任何
init...方法之前使用alloc创建一个NSString。这就是它在 ObjC 中的工作方式,而 PyObjC 让您遵循该约定。不过,你已经想通了。返回None的初始化方法意味着它无法从您传递的数据中解码字符串。您确定数据是 UTF-8 吗?你确定你有正确的块吗?看起来您正在尝试对 plist 进行双重解码;一次使用dictionaryWithContentsOfFile_,再次使用propertyListWithData_...。 -
不过,我不确定该 plist 的内容是什么。
-
所以,我想我认为 NSUTF8StringEncoding 是由于某种原因它将被转换为的字符串类型,而不是 FROM。我要弄清楚它是什么编码
标签: python nsstring nsdata pyobjc