我正在为目标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解决方案也适用于此..
答案 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提供的逐字节解决方案就是您的选择。