1

文字列を文字ごとに整数に変換しています。したがって、「A」-「0」は10になります。ただし、数字は正常に表示されますが、アルファベット文字(つまり、AF)は7だけずれているように表示されます。たとえば、変換用のコード行は次のとおりです。

result = result + (((int) (*new - '0')) * pow(16, bases));

「A2C9」のような16進文字列に対してその行を1つずつ印刷すると、何らかの理由でAが17に変換され、Cが19に変換されます。ただし、2と9の数字は正しく出力されます。どこかで何かが足りないかどうかを調べようとしています。

4

2 に答える 2

2

ASCII値を減算しています。これはAZと0-9の場合は問題ありませんが、それらを混合し始めた場合は問題ありません。問題をよりよく理解するためにASCIIテーブルについて読んでください。

表は次のとおりです: http ://www.asciitable.com/index/asciifull.gif

于 2013-02-04T02:17:35.517 に答える
1

'A'のASCIIコードは65です。'Z'の場合は90です。'0'のASCIIコードは48です。'9'の場合は57です。これらのコードは、Unicode(UTF-8)、8859-x、およびその他の多くのコードセットでも使用されます。

を計算する'A' - '0'と、65-48 = 17になります。これは、表示されている「7単位のオフ」です。

アルファベット文字「A」から「F」を同等の16進数に変換するには、次のバリエーションが必要です。

c - 'A' + 10;

'a'から'f'も許可されており、それらには次のものが必要です。

c - 'a' + 10;

または、最初に大文字に変換する必要があります。または、次を使用できます。

const char hexdigits[] = "0123456789ABCDEF";

int digit = strchr(hexdigits, toupper(c)) - hexdigits;

または他の無数のテクニックのいずれか。cこの最後のフラグメントは、が有効な16進数を含むことがわかっていることを前提としています。そうでない場合、それはひどく失敗します。

Cは、0〜9の数字のコードが連続していることを保証しますが、AZの文字のコードが連続していることを保証しないことに注意してください。特に、コードセットがEBCDIC(主にIBMメインフレームでのみ使用されるわけではありません)の場合、文字のコードは連続していません。

于 2013-02-04T02:21:10.090 に答える