C:将32位无符号int拆分为字节,并根据结果构造字符串

时间:2014-01-07 00:57:01

标签: c arrays

我试图将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命令的性能成本很高,因为我要调用这个函数数千次,所以想知道是否有人建议更好/更快地实现这个目的。

提前感谢任何建议。

4 个答案:

答案 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的长度,这是不必要的。)

如果您想要变量字符串的长度,可以使用std::string。 (我不知道它的性能..如果你使用它,你可能需要比较性能。)哦,你的代码似乎是Objective-C ..

答案 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);