【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18639

char [] からunsigned char []への変換について
投稿者---haru(2004/12/12 14:04:29)


いつも拝見させていただいております。
早速なのですが、
windows2000Server で、VC++ 4.2をコンパイラとして使用して、
DLLファイルを作成し、その中でchar []型 からunsigned char []型へコピー
しているのですが、変数をfputで確認するとコピーできないのですが、
懸念点等ございましたらご教授願います。

実際にはソースは以下のように行なっております。
---------------ここから-------------------
char a_data[ 300 ];
unsignedchar b_data[ 300 ];

fputs(a_send_data,fp);
memmove((char *)b_data,a_data,sizeof(a_data));
fputs(b_data,fp);
---------------ここまで-------------------
b_dataをfputでファイルから確認すると文字化けしてしまいます。

また以下のような仕様になっております。
・データにはNULL文字列が入る可能性があるため、strcpyは使えなく、memmoveを使用しています。
・データは、oracle上でVARCHAR2として作成されたデータを引数で受け取り使用しています。(上記でのa_data変数)


どなたかご教授ください。よろしくお願いいたします。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:char [] からunsigned char []への変換について 18644 RAPT 2004/12/12 19:48:19


No.18644

Re:char [] からunsigned char []への変換について
投稿者---RAPT(2004/12/12 19:48:19)


事象を再現できる最小限のコードを書いてください。
# データの切捨てによるものなのか。

それから、fputって何ですか?
正しい言葉を使って下さい。

unsigned char と singned char とで表現できる範囲が違うのは
ご存知ですよね?
Windows2000sp4/VC++6.0sp6/Console-App(.c) で下記のコードを
コンパイル・実行してみましたが、再現しませんでした。

下記の警告が出ましたが。
> ctest.c(12) : warning C4057: 'function' : 
> 'const char *' で使われているポインタ式は 
> 'unsigned char [300]' とベース型が異なっています。


#include <stdio.h>
#include <string.h>

int main()
{
  char a_data[ 300 ] = "abcdefあいうえお\n";
  unsigned char b_data[ 300 ] = "";
  FILE *fp = fopen("test.txt", "w");
  fputs(a_data, fp);

  memmove((char *)b_data, a_data, sizeof(a_data));
  fputs(b_data, fp);
  
  fclose(fp);

  return 0;
}




この投稿にコメントする

削除パスワード

No.18648

Re:char [] からunsigned char []への変換について
投稿者---haru(2004/12/12 22:29:56)


RAPT様
ご返信ありがとうございます。
言葉につきまして申し訳ございません。

今回の事象なのですが、実はOracleもからんでいます。
Oracle8i R8.1.7 wor windowsからCのDLLファイルをコールしております。
Oracle上でVARCHAR2で作成したデータをCのDLLファイルに引数で渡しております。データは、ASCIIコード表であらわされる範囲です。
CのDLLでそのデータはchar[]型で受け取っているのですが、unsigned char []へ変換を行ないたいのですができません。

下記にソースを記述いたしましたが、Cの中でデータを作成して変換すると変換できます。
Oracleから渡されたデータで変換ができないのがなぜなのかmemcpyコマンドによる型変換に懸念事項があるのであればご教授願います。


以下は、変換ができるときのソースです。(異常時のソースではないですが同じような内容です)

よろしくお願いいたします。

---------------ここからソースです-------------------

#include <stdio.h>
#include <string.h>

void main()
{
    char ora_send_data[ 300 ];
    unsigned char send_data[ 300 ];
    char *recv;

    strcpy(ora_send_data,"abcdefghijklmn");
    
    printf ("CHECKORA0 = %x\n",ora_send_data[0]);
    printf ("CHECKORA1 = %x\n",ora_send_data[1]);
    printf ("CHECKORA2 = %x\n",ora_send_data[2]);
    printf ("CHECKORA3 = %x\n",ora_send_data[3]);
    printf ("CHECKORA4 = %x\n",ora_send_data[4]);
    printf ("CHECKORA5 = %x\n",ora_send_data[5]);
    printf ("CHECKORA6 = %x\n",ora_send_data[6]);
    printf ("CHECKORA7 = %x\n",ora_send_data[7]);
    printf ("CHECKORA8 = %x\n",ora_send_data[8]);
    printf ("CHECKORA9 = %x\n",ora_send_data[9]);
    printf ("CHECKORA10 = %x\n",ora_send_data[10]);
    recv = memcpy((char *)send_data,ora_send_data,sizeof(ora_send_data));

    printf ("CHECK0 = %x\n",send_data[0]);
    printf ("CHECK1 = %x\n",send_data[1]);
    printf ("CHECK2 = %x\n",send_data[2]);
    printf ("CHECK3 = %x\n",send_data[3]);
    printf ("CHECK4 = %x\n",send_data[4]);
    printf ("CHECK5 = %x\n",send_data[5]);
    printf ("CHECK6 = %x\n",send_data[6]);
    printf ("CHECK7 = %x\n",send_data[7]);
    printf ("CHECK8 = %x\n",send_data[8]);
    printf ("CHECK9 = %x\n",send_data[9]);
    printf ("CHECK10 = %x\n",send_data[10]);
    
    if(fclose(fp)==EOF) {
        return;
    }
    
}




この投稿にコメントする

削除パスワード

No.18649

Re:char [] からunsigned char []への変換について
投稿者---RAPT(2004/12/12 23:04:08)


Oracleとの連携はやった事がないので分かりませんが。
いずれにしろ、再現されるコードでないと何ともいえません。
ASCIIコード表の範囲って、7bit以内ってこと?
肝心の部分の回答がないので、適切な回答ができません。

連携部分が問題なのか、それともデータのコピーが問題なのか、
その辺の切り分けはできていますか?

本当に受け取ったデータは正しいのですか?
その正当性はどのように判断しましたか?

受け取ったデータの語尾は '\0' で埋められていますか?

sizeof演算子を使用せずに適当な即値を指定した場合はうまくいきますか?
# 即値→ 5 とか 10 とか。



この投稿にコメントする

削除パスワード

No.18651

Re:char [] からunsigned char []への変換について
投稿者---haru(2004/12/12 23:59:48)


RAPT様
ご返信ありがとうございます。

>ASCIIコード表の範囲って、7bit以内ってこと?
肝心の部分の回答がないので、適切な回答ができません。
●はい。現在使用しているデータは7bit以内です。

>本当に受け取ったデータは正しいのですか?
>その正当性はどのように判断しましたか?
●まず、データの受け渡しについてはマニュアル上から手順を確認。その上で以下のようにデバッグを行ないました。
●データを"abcdefgh・・・"と取りmemcpyを実施する直前にfprintfコマンドでデータを16進数で確認いたしました。以下のように出力されました。
CHECKORA0 = 61
CHECKORA1 = 62
CHECKORA2 = 63
CHECKORA3 = 64
CHECKORA4 = 65
CHECKORA5 = 66
CHECKORA6 = 67
CHECKORA7 = 68
CHECKORA8 = 69
CHECKORA9 = 6a
CHECKORA10 = 6b
  :

一方、memcpyコマンド実行後コピー先となる変数も上記のように確認いたしましたところ、
CHECK0 = 61
CHECK1 = 62
CHECK2 = 63
CHECK3 = 64
CHECK4 = 68
CHECK5 = ef
CHECK6 = 12
CHECK7 = 0
CHECK8 = b3
CHECK9 = 2
CHECK10 = e7
と明らかに変わっています。

先ほどのコードで、memcpyするデータを7ビットで表すことのできる全データで実施したところコピーされているのに、上記ではうまくコピーされません。

>受け取ったデータの語尾は '\0' で埋められていますか?
>sizeof演算子を使用せずに適当な即値を指定した場合はうまくいきますか?
# 即値→ 5 とか 10 とか。

確認してみます。

よろしくお願いいたします。


この投稿にコメントする

削除パスワード

No.18659

Re:char [] からunsigned char []への変換について
投稿者---gf(2004/12/13 10:32:20)


>recv = memcpy((char *)send_data,ora_send_data,sizeof(ora_send_data));

sizeof(ora_send_data)のサイズが300か確認してみましょ



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧