gpt4 book ai didi

iOS/C : Convert "integer" into four character string

转载 作者:技术小花猫 更新时间:2023-10-29 10:19:45 26 4
gpt4 key购买 nike

许多与 Audio Session 编程相关的常量实际上是四字符字符串 ( Audio Session Services Reference )。这同样适用于 OSStatus codeAudioSessionGetProperty 等函数返回。

问题是,当我尝试打印这些开箱即用的东西时,它们看起来像 1919902568。我可以将其插入计算器并打开 ASCII 输出,它会告诉我“roch”,但必须有一个以编程方式执行此操作。

我使用以下 block 在我的一个 C 函数中取得了有限的成功:

char str[20];
// see if it appears to be a four-character code
*(UInt32 *) (str + 1) = CFSwapInt32HostToBig(error);
if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {
str[0] = str[5] = '\'';
str[6] = '\0';
} else {
// no, format as integer
sprintf(str, "%d", (int)error);
}

我想做的是从当前功能中抽象出此功能,以便在其他地方使用它。我试过做

char * fourCharCode(UInt32 code) {
// block
}
void someOtherFunction(UInt32 foo){
printf("%s\n",fourCharCode(foo));
}

但这给了我“à*€/3íT:ê*€/+€/”,而不是“roch”。我的 C fu 不是很强,但我的直觉是上面的代码试图将内存地址解释为字符串。或者可能存在编码问题?有什么想法吗?

最佳答案

您所说的类型是 FourCharCode,在 CFBase.h 中定义。它等同于 OSType。在 OSTypeNSString 之间转换的最简单方法是使用 NSFileTypeForHFSTypeCode()NSHFSTypeCodeFromFileType()。不幸的是,这些功能在 iOS 上不可用。

对于 iOS 和 Cocoa 可移植代码,我喜欢 Joachim Bengtsson's FourCC2Str() 来自他的 NCCommon.h (加上一点类型转换清理以便于使用):

#include <TargetConditionals.h>
#if TARGET_RT_BIG_ENDIAN
# define FourCC2Str(fourcc) (const char[]){*((char*)&fourcc), *(((char*)&fourcc)+1), *(((char*)&fourcc)+2), *(((char*)&fourcc)+3),0}
#else
# define FourCC2Str(fourcc) (const char[]){*(((char*)&fourcc)+3), *(((char*)&fourcc)+2), *(((char*)&fourcc)+1), *(((char*)&fourcc)+0),0}
#endif

FourCharCode code = 'APPL';
NSLog(@"%s", FourCC2Str(code));
NSLog(@"%@", @(FourCC2Str(code));

您当然可以将 @() 放入宏中,以便于使用。

关于iOS/C : Convert "integer" into four character string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com