【发布时间】:2014-01-07 00:57:00
【问题描述】:
我正在尝试将 32 位无符号整数拆分为 4 个字节的数组,然后在字符串中重构这些字节以用作文件路径
我正在使用位移将 int 拆分为 char 数组,如下所示:
void splitIntegerUsingBitShifting(int value, unsigned char *result)
{
result[0] = (value >> 24) & 0xFF;
result[1] = (value >> 16) & 0xFF;
result[2] = (value >> 8) & 0xFF;
result[3] = value & 0xFF;
}
目前只能使用 sprintf 命令成功创建文件路径:
+ (void) storeIntegerStructureUsingBitShifting:(int) fingerprint trackID:(int) track
{
unsigned char bytes[4];
splitIntegerUsingBitShifting(fingerprint, bytes);
char home[15] = "/rootdirectory/";
char fullpath[100];
char *delimeter = "/";
sprintf(fullpath, "%s%d%s%d%s%d%s%d", home, bytes[0], delimeter, bytes[1], delimeter, bytes[2], delimeter, bytes[3]);
printf("\"%s\"", fullpath);
}
我已经读到 sprintf 命令在性能方面可能代价高昂,并且由于我将调用此函数数千次,想知道是否有人建议以更好/更快的方式实现此目的。
提前感谢您的任何建议。
【问题讨论】:
-
如果您使用这些文件路径打开文件,与打开/创建文件的系统开销相比,sprintf 开销可能微不足道。顺便说一句,我建议使用
%u而不是%d以避免负数。 -
如果您在其他地方使用 printf 而不仅仅是调试,sprintf 将增加可忽略不计的开销。如果您不介意 HEX 值,则转换为 HEX 字节非常简单,例如const char hexmap="0123456789ABCDEF";字符[0]=hexmap[字节[0]>>4];字符[1]=hexmap[字节[0]&0x0F];等等;;;
-
DoxyLover 和 EkriirKe - 感谢您的建议。我接受了 ikh 的回答,因为它不使用 sprintf 并以十进制格式生成输出