2016-05-07 18 views
-1

私は必要な解決策を見つけていなかったので、私は次のようにstrtolを使用しようとしたthis質問をチェックアウトした後:strtolは結果の不一致ながら、文字列変換

:このコードは、いくつかの中間値を生成

in = (unsigned char *)malloc(16); 

for(size_t i = 0; i < (size_t)strlen(argv[2])/2; i+=2) 
{ 
    long tmp = 0; 
    tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16); 
    memcpy(&in[i], &tmp, 1); 
} 

Watches of local variables

全体in配列は0xFF(255)バイトで満たされますと、なぜtmpが等しくない理由を誰かが私に説明していただけますそれは推定値ですか?

inの配列に正しい16進値を入力するように上記のコードを改善する方法についてのヒントも歓迎します。

+0

[ask] – Amit

+1

を読む必要があります。キャストを取り除きます。 '(unsigned char *)'は不要です。 '(size_t)'は 'strlen()'の戻り値の型がすでに 'size_t'であるので不要です。 '(const char *)argv [2] + i、&argv [2] + 2'は間違っています。 – cremno

+0

'strtol'の第2引数は間違っています - 入力文字列とは関係ありません。そして、あなたのループは 'strlen(...) '' 'strlen(...)/ 2'ではなく、16進数の最初の組、次の組などをスキップして入力文字列を何度か変換しようとしています。 –

答えて

1

あなたのコードは、複数のカウントのために誤っているとキャストが問題を隠す:

mallocの戻り値はCで必要ではなく、あなたが<stdlib.h>を含めることを忘れた場合、潜在的に危険な変換を非表示にすることができますキャスト(size_t)strlenの戻り値をキャスト

in = (unsigned char *)malloc(16); 
size_t

を返すように定義されていても冗長strlenとして、無駄です。再び、あなたは<string.h>を含めるのを忘れているかもしれません...

for (size_t i = 0; i < (size_t)strlen(argv[2])/2; i += 2) { 
    long tmp = 0; 

strtolargv[2] + iが暗黙的に変換されますcharへのconstポインタを取ります。キャスト(const char*)は役に立たない。 2番目の引数はchar*のアドレスです。あなたのループの目的は、非常にあいまいですが、あなたはmemcpytmpでlong値をコピーする

tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16); 

...、あなたがするインデント何を最も確かに、他の用語 &argv[4]で、 argvの5番目の要素のアドレスではなく渡します sizeof(tmp)バイトをコピーする必要があります。 charのサイズとターゲット・システムのエンディアンに応じて、 最初バイトのみの実装が定義されている効果をコピー:

memcpy(&in[i], &tmp, 1); 
} 

はあなたの問題を示し、完全なコンパイルの例を投稿する必要があり、コードの断片でありますどのヘッダファイルが含まれているか、どのように変数が定義されているか、フラグメントの前にどのコードが実行されているかなど、重要なコンテキスト情報がありません。

書かれているように、コードはあまり意味がありません。その動作を解釈しようとするのは無意味です。

参考までに、あなたのコードでは、16進文字列をバイト配列に変換するためのソリューションをリモートで提供していません。

関連する問題