16進表現からデコードするときに、(潜在的に非常に長い)文字列をchar * s = "2f0a3f"
それが表す実際のバイトに変換する必要があります。現在私はこれをやっていますが、それは不格好で間違っていると感じています。
size_t hexlength = strlen(s);
size_t binlength = hexlength / 2;
unsigned char * buffer = malloc(binlength);
long i = 0;
char a, b;
for (; i < hexlength; i += 2) {
a = s[i + 0]; b = s[i + 1];
buffer[i / 2] =
((a < '9' ? a - '0' : a - 'a' + 10) << 4) + (b < '9' ? b - '0' : b - 'a' + 10);
}
これについて私は2つのことを醜いと思います。
- バッファにプッシュするたびに2で割る方法
- 16進数の10進値を計算するための条件付きロジック
もっと良い方法はありますか?できれば、依存関係を追加する必要があるものを使用しないでください(クロスプラットフォームの問題を最小限に抑えてこのコードを出荷したいため)。私のビット単位の数学はひどいです;)
注:データは、すべて小文字であり、16進ペアの正しい文字列であることが事前に検証されています。