あなたのコードは、複数のカウントのために誤っているとキャストが問題を隠す:
:
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;
strtol
はargv[2] + i
が暗黙的に変換されますchar
へのconstポインタを取ります。キャスト(const char*)
は役に立たない。 2番目の引数はchar*
のアドレスです。あなたのループの目的は、非常にあいまいですが、あなたはmemcpy
でtmp
で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進文字列をバイト配列に変換するためのソリューションをリモートで提供していません。
[ask] – Amit
を読む必要があります。キャストを取り除きます。 '(unsigned char *)'は不要です。 '(size_t)'は 'strlen()'の戻り値の型がすでに 'size_t'であるので不要です。 '(const char *)argv [2] + i、&argv [2] + 2'は間違っています。 – cremno
'strtol'の第2引数は間違っています - 入力文字列とは関係ありません。そして、あなたのループは 'strlen(...) '' 'strlen(...)/ 2'ではなく、16進数の最初の組、次の組などをスキップして入力文字列を何度か変換しようとしています。 –