掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
文字列を16進コードに変換するには (ID:51049)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
sprintfを使うなら,unsigned charへキャストする必要があります。 汎整数拡張によって,signed char/shortはintに,unsigned char/unsigned shortはunsignedにそれぞれ変換されるからです。 ちなみに,Cではchar/shortでの演算は全てintで行われます。 なので, void func (short); なんてのを使うと,処理系次第では呼び出しごとに警告を発してくれます。 自力で書いてしまっても大したものではないですけどね……。 #Cだと自力で書いた方が簡単かも。 とりあえず,適当に書いてみました。 /* C言語用 */ #define BYTE_PER_CHARACTER ((CHAR_BIT + 3) / 4) /* 大抵のコンパイラでは 2 */ /* buffer : 出力先 mem : 入力 size : 入力の大きさ 戻り値 : buffer。必要な大きさはsize * BYTE_PER_CHARACTER + 1。 */ char * convertToHex (char * buffer, const void * mem, size_t size) { const unsigned char * src = mem; size_t i; for (i = 0; i < size; ++i) { #if BYTE_PER_CHARACTER == 2 buffer[i * 2] = "0123456789ABCDEF"[src[i] / 0x10]; buffer[i * 2 + 1] = "0123456789ABCDEF"[src[i] % 0x10]; #else /* 1バイトが8ビットより大きい処理系 */ unsigned char data; int j; data = src[i]; for (j = BYTE_PER_CHARACTER - 1; j >= 0; --j) { buffer[i * BYTE_PER_CHARACTER + j] = "0123456789ABCDEF"[data % 0x10]; data /= 0x10; } #endif } buffer[i * BYTE_PER_CHARACTER] = 0; return buffer; } // C++言語用 // buffer : 出力先 // first : 入力バイト列の先頭 // last : 入力バイト列の末尾 // 戻り値 : bufferに書き込んだ文字の数。 // 必要なバッファサイズは,(std::numeric_limits<unsigned char>::digits + 3) / 4 * std::distance<const unsigned char *>(first, last)で求められる。 std::size_t convertToHex (char * buffer, const void * first, const void * last) { std::ostringstream oss(""); oss << std::hex << std::setfill('0') << std::uppercase; for (const unsigned char * first_ = static_cast<const unsigned char *>(first); first_ != last; ++first_) { oss << std::setw((std::numeric_limits<unsigned char>::digits + 3) / 4) << static_cast<unsigned int>(*first_); } const std::string & temp = oss.str(); temp.copy(buffer, temp.length()); return temp.length(); }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.