iOS Obj-C将字节数组转换为plist到string

时间:2015-02-09 16:49:16

标签: ios objective-c logging

唉,我疯了。

我有以下功能,我尝试使用自定义记录器

进行记录
CFWriteStreamWrite(CFWriteStreamRef stream, const UInt8 *buffer,
    CFIndex bufferLength) {

NSData *data = [[NSData alloc] initWithBytes:buffer length: bufferLength]; 


NSString *errorDesc = nil;
NSPropertyListFormat format;
NSString * str = (NSString*)[NSPropertyListSerialization
                                      propertyListFromData:data
                                      mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                      format:&format
                                      errorDescription:&errorDesc];


custom_log(CF, "CFURLCreateWithString: %s", str);
}

当我使用自定义记录器时,我得到了垃圾输出

CFURLCreateWithString: <       °3€

但是当使用NSLog时,一切正常,

Feb 10 00:36:39: {
        bundleID = "com.test.testapp";
        pid = 2852;
    }

自定义记录器

EXPORT void custom_log(unsigned int facility, const char *msg, ...) {
if (minLogLevel <= INFO) {
    char *msgBuffer;
    va_list args;
    va_start(args, msg);
    vasprintf(&msgBuffer, msg, args);
    va_end(args);

    dispatch_async(logQueue, ^{
        write(facility, INFO, msgBuffer);
    });
}
}

请告诉我我哪里出错了,过去3个小时我都在尝试转换为不同的数据类型。没有运气。

另外,是否可以将NSLog的输出变为字符串然后我将其传递给我的记录器?

1 个答案:

答案 0 :(得分:1)

您可能遇到的一个问题是,NSStringc_str方法可能希望替换vasprintf的{​​{1}}不同

要解决此问题,我很确定您无法直接将%s转换为NSPropertyListSerialization,但我自己并未对其进行测试。您可能正在寻找这样的替代方案:

NSString

当然,既然你已经在合成一个字符串,为什么不在同一个地方完成呢?

NSString * str = [NSString stringWithFormat:@"%@", [NSPropertyListSerialization
                                  propertyListFromData:data
                                  mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                  format:&format
                                  errorDescription:&errorDesc]];


custom_log(CF, "CFURLCreateWithString: %s", [str UTF8String]);

作为一个有趣的辅助项目,你可以考虑在main.mm中做这样的事情。如果您想要的不仅仅是错误内容,请将NSString * str = [NSString stringWithFormat:@"CFURLCreateWithString: %@", [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]]; custom_log(CF, [str UTF8String]); 替换为stderr

stdout