1

我正在针对 iOS 的 Objective C 中进行一些图像转换,并且在将总图像大小保存在字节数组中时遇到了一些困难。

我做了一些搜索,stackoverflow 有很多关于从十进制转换为十六进制的问题,但它们都解释了如何使用%xprintf(或 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

我找到了这个线程并尝试了它

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 解决方案也适用于此。

4

2 回答 2

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 或其他文件)与十进制/十六进制转换无关。它将内存中的数字存储到文件中的字节中,十进制/十六进制根本没有真正进入它(除了打印值供人类阅读以进行调试)。

于 2013-03-04T07:00:32.737 回答
0

如果您在 iOS 下执行此操作,这是 little endian,并且您想要 little endian 顺序,那么它很简单:

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

如果你想要一个跨平台的解决方案,那么@hyde 提供的逐字节解决方案就是你要走的路。

于 2013-03-04T09:16:52.047 回答