1

私は iOS 用の目的の C でいくつかの画像変換に取り組んでおり、合計画像サイズをバイト配列に保存するのにいくつかの問題があります..

私はいくつかの検索を行いました.stackoverflowには10進数から16進数への変換に関する多くの質問がありますが、それらはすべて、%xprintf(またはNSLog)を使用して16進数値を出力する方法を説明していますが、これは私が望むものではありません.

サイズ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

これは正しい値ではありませんか、ここで明らかな何かが欠けていますか?

EDIT:申し訳ありませんが、エンディアンの部分を入れ忘れました..リトルエンディアン形式で保存したいです。

注 : ここでも 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

その 2 番目のコードは、多くの点で間違っています。その目的は何ですか?

おそらくこれが必要ですか(ループなどはありません):

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

それとも、値が 16 進文字列として出力されるときに、個々の文字の ASCII コードが本当に必要ですか?


うーん、また「10進数から16進数への変換あり」とはどういう意味ですか?数値をバイナリ ファイルに格納すること (イメージ ファイルはバイナリ ファイルであり、XML などではないと思われます) は、10 進数/16 進数の変換とは関係ありません。メモリ内の数値をファイル内のバイトに格納しており、10 進数/16 進数は実際にはまったく入力されません (人間がデバッグ目的で読み取るための値を出力する場合を除く)。

于 2013-03-04T07:00:32.737 に答える
0

リトル エンディアンの iOS でこれを行っていて、リトル エンディアンの順序が必要な場合は、次のように簡単です。

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

クロスプラットフォーム ソリューションが必要な場合は、@hyde が提供するバイト単位のソリューションが最適です。

于 2013-03-04T09:16:52.047 に答える