将十进制转换为十六进制,添加到字节数组

时间:2013-03-04 06:53:01

标签: ios objective-c c hex decimal

我正在为目标C进行一些图像转换,对于iOS,并且在保存字节数组中的总图像大小方面存在一些困难。

我做了一些搜索,stackoverflow有很多问题,从十进制转换为十六进制,但所有这些都解释了如何使用%x和printf(或NSLog)打印十六进制值,这不是我想要的。

我的图片大小为2500

int totalSize  = 2500;

我想将此尺寸添加到图片标题中的特定索引

UInt8 headerData[HEADER_SIZE];
memset(headerData, 0, HEADER_SIZE);

//2500 dec  = 9C4 hex
headerData[2]   = 0xC4;
headerData[3]   = 0x09;
headerData[4]   = 0x00;
headerData[5]   = 0x00;    //image size total 4 bytes

我找到了this帖子并尝试了

char hexval[5];
memset(hexval, 0, 5);
if (totalSize <= 0xFFFF){
    sprintf(&hexval[0], "%0x", totalSize);
}

printf("%x %x %x %x", hexval[0], hexval[1], hexval[2], hexval[3]);

并打印

36 36 33 32

这不是正确的值,还是我错过了一些明显的东西?

编辑:抱歉,忘了把字节序部分..我想用小端格式保存。

注意:我也在添加C标签,因为C解决方案也适用于此..

2 个答案:

答案 0 :(得分:5)

修订:所以这不是字节顺序问题,但是这里的代码是以字节顺序逐字节地正确获取字节值:

int totalSize = 2500;

headerData[2] = totalSize >> 0 & 0xFF; // 0xC4
headerData[3] = totalSize >> 8 & 0xFF; // 0x09
headerData[4] = totalSize >> 16 & 0xFF; // 0x00
headerData[5] = totalSize >> 24 & 0xFF; // 0x00

第二段代码虽然在很多方面都是错误的。这是什么目的?

你是否只想要这个(没有循环或任何东西):

printf("%04x", totalSize);

或者将它转换为hexval C字符串并打印出来:

char hexval[5]; // actually, since totalSize can be > 0xFFFF, 9 would be better size
snprintf(hexval, sizeof hexval, "%04x", totalSize); // note: sizeof hexval only works if hexval is char array with static size
printf("%s", hexval);

或者确实想要单个字符的ASCII码,当值打印为十六进制字符串时?


嗯,当你说“从十进制转换为十六进制”时,你的意思是什么?将数值存储到二进制文件(我假设您的图像文件是二进制文件而不是XML或其他东西) nothing 与十进制/十六进制转换有关。它在内存中存储一​​个数字到文件中的字节,并且十进制/十六进制根本不会真正进入它(除了为了调试目的而打印人类读取的值)。

答案 1 :(得分:0)

如果您是在iOS下进行此操作,这是一个小端,并且您想要小端序,那么它很简单:

*(uint32_t *)(header + 2) = totalSize;

如果您需要跨平台解决方案,那么@hyde提供的逐字节解决方案就是您的选择。

相关问题