我试图将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命令的性能成本很高,因为我要调用这个函数数千次,所以想知道是否有人建议更好/更快地实现这个目的。
提前感谢任何建议。
答案 0 :(得分:1)
您可以使用strXXX函数和itoa函数代替sprintf。例如:
char buf[4];
strcpy(fullpath, home);
itoa(bytes[0], buf, 10);
strcat(fullpath, buf);
strcat(fullpath, delimeter);
itoa(bytes[1], buf, 10);
strcat(fullpath, buf);
strcat(fullpath, delimeter);
itoa(bytes[2], buf, 10);
strcat(fullpath, buf);
strcat(fullpath, delimeter);
itoa(bytes[3], buf, 10);
strcat(fullpath, buf);
strcat(fullpath, delimeter);
如果你还有投诉,你可以只重写itoa
只有十进制(它也可能需要,因为itoa
不是标准C),并制作你自己的strcpy
/ strcat
返回/接收fullpath
的长度。 (每个strcat都会找到fullpath
的长度,这是不必要的。)
如果您想要变量字符串的长度,可以使用哦,你的代码似乎是Objective-C .. std::string
。 (我不知道它的性能..如果你使用它,你可能需要比较性能。)
答案 1 :(得分:1)
这是一个建议:将值拆分为半字节(4位值)并使用每个半字节作为字符串0123456789abcdef
的索引,这将为您提供字符串的十六进制表示。当然,它有一个“标准”功能(虽然它不是标准库的一部分,但它可以广泛使用):itoa
,基数为16。
答案 2 :(得分:0)
您可以在没有库函数的情况下执行此操作,例如将您自己的版本限制为单字节输入:
unsigned char bytes[5];
char outstr[16]; // 3 digits *4 bytes + 3 delimiters + terminator
int i,j,n,d;
splitIntegerUsingBitShifting(fingerprint, bytes);
for (i=j=0;i<4;i++){
for (d=100;d;d/=10){
n=bytes[i]/d;
bytes[i]%=d;
if (n||d==1) //remove this line if you want all dirs to be 3 digit numbers.
outstr[j++]=n+'0';
}
outstr[j++]=delimiter;
}
outrstr[--j]='\0'; //overwrite trailing delimiter
答案 3 :(得分:-2)
您不需要移位和复制单个字符。
您可以只需要memcpy
char str[5];
数组所需的4个字节,并将最后一个字节设置为'\0'
。
int val = 0xabcd3434;
char str[5];
memcpy(str, &val, sizeof(int)); // hopefully its 4 ;)
str[4] = '\0';
printf("%s", str);