• 締切済み

pro*cでバイナリデータの扱い方

pro*cでバイナリデータをRAW型で登録したいと思っています。 その際に、 ホスト変数をunsigned char aa[100]; insert時にutl_raw.cast_to_raw で変換して行うと、データに0x00が途中ではいると、その前データまでしかinsertできません。 何かよい方法があればご教授願います。

みんなの回答

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ muyoshid です。 > データに0x00が途中ではいると、・・・ 確認はしていませんが、ホスト変数にvarchar 型を使って見てはどうでしょう? varchar 型はC 言語では struct { unsigned short len; char arr[xxx]; } aa; と展開されます。 len に、格納したいデータのバイト長を入れて下さい。

bsb0220
質問者

お礼

早々のご回答ありがとうございます。 早速試してみたところ、無事に処理することができました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • oracle10g eucのblobをsjisのcharに変換したい

    oracle10g eucのblobをsjisのcharに変換したい oracle10gでblob型でeuc_jpの文字列を格納しています これをshift_jisのvarchar2に変換したいのですが 無理でしょうか? utl_raw.cast_to_nvarchar2では文字化けしました

  • テキストデータをバイナリデータに変換したい

    テキストファイルに以下のデータがあるとします。 テキストデータの中身、 「 000E6D4181AA,1234567890ABCDEF 0123456789AB,0100000000000000 050505AAAAAA,0200000000000000 070707BBBBBB,0300000000000000 012345CCCCCC,0400000000000000 cdef01DDDDDD,0500000000000000  ・  ・  ・ 」 12桁の数値(16進数)と16桁の数値(16進数)を「,」で区切ります。1行の終端は改行しています。 このテキストファイルにあるデータを以下のバイナリ形式に変換させたいのです。バイナリ形式の各行の16バイト目は、テキストデータにはデータがないので、「00」とします。「,」で区切ったバイナリ形式は「2C」になると思います。 テキストデータの左上から順に「00」は以下の、左上から順の「00」に対応します。 バイナリデータの中身、 「 00 0E 6D 41 81 AA 2C 12 34 56 78 90 AB CD EF 00 01 23 45 67 89 AB 2C 01 00 00 00 00 00 00 00 00 05 05 05 AA AA AA 2C 02 00 00 00 00 00 00 00 00 07 07 07 BB BB BB 2C 03 00 00 00 00 00 00 00 00 01 23 45 CC CC CC 2C 04 00 00 00 00 00 00 00 00 CD EF 01 DD DD DD 2C 05 00 00 00 00 00 00 00 00  ・  ・  ・ 」 ソースコードでの例、 テキストデータ1行目の1つ目の「,」までのデータ「000E6D4181AA」を、メモリ領域に読み込む。2桁の数値を1バイトで格納する。 つまり、 char buf[6]とすると、 buf[0]=0xAA buf[1]=0x81 buf[2]=0x41 buf[3]=0x6D buf[4]=0x0E buf[5]=0x00 とこのようにメモリに格納したいのです。 格納するバイトオーダーはリトルエンディアン方式とします。 以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。

  • C言語の条件式での~(チルド)について

    C言語に関しての質問です。 以下のようなプログラムでは変数bをキャストした場合と しない場合で条件式の判定結果が違います。 変数bはもともとunsiged char型なのでキャストは不要だと 思ったのですが、なぜ結果が違うのでしょうか? (条件式if(a != ~b)の判定結果も偽になることを期待していました。) unsigned char a; unsigned char b; a = ~0x98; b = 0x98; if(a != ~b) { printf("こっちは入る"); } if(a != (unsigned char)(~b)) { printf("こっちは入らない"); }

  • C言語の配列の要素番号を得る

    例えば、 union ary_tag{ unsigned char byte[23]; struct { unsigned char aa; unsigned char bb; unsigned char cc; unsigned char dd; unsigned char ee; 途中省略 unsigned char xx; unsigned char yy; unsigned char zz; }a_z; } union ary_tag ary; とした場合、ary.a_z.xxは、配列で言うと何番目になるかを取得したいです。 number = &ary.a_z.xx - &ary.a_z.aa として算出しました。 他にやり方はあるのでしょうか?

  • バイナリ出力

    バイナリのテストデータを作成しており、VBAで作成中です。 以下の内容で困っております。 「0~65525の値を2バイトの情報(VCでいうunsigned shortの型)としてバイナリファイルに出力する。」 変数long型で値を取得した場合、4バイトの情報としてバイナリ出力されてしまいます。これを2バイトの情報として出力する方法をご教授願えないでしょうか? よろしくお願いします。

  • Mscomm を使用してバイナリでデータを受信したい

    Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか? (垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >) また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか? まず考え方として以下の流れでよいでしょうか? バイナリデータをバリアント型の変数に入れる。(受信する)      ↓ このデータを1バイトごとにバイト型変数の配列に入れていく。      ↓ 格納した配列の中の制御文字を取り除く。( ST、EX )      ↓ 配列に入っているデータを文字に変換する。      ↓ 変換した文字をつなぐ。 受信するデーターが制御文字を含んでいる為、テキストで受信するとおかしな動作をすることがあるので(150バイト程度のデーターを、バッファから変数に移すときに、0.5~2.5秒もかかってしまうし、文字化けも時々起こす。)バイナリで受信してその後文字に変換したいのですが・・・。 宜しくお願い致します。

  • C言語のキャストについて

    お世話になります。 CRC-16の計算プログラムをC言語でつくりました。 例えば・・・1F 08 00 00 12 34 なら“1F0800001234”と入力すると【EEC2】と表示するプログラムです。 ただ・・・.Net SDKでコンパイルするとできたのですが、Visual C++2008でコンパイルするとエラーが出てしまいます。 (48) : error C2664: 'strlen' : 1 番目の引数を 'unsigned char [256]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 (52) : error C2664: 'strtol' : 1 番目の引数を 'unsigned char [3]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 型変換が必要ってことまではわかったのですが・・・必要なのはわかって行き詰まり状態です。。。 どのようしたらよいのでしょうか?ご教授をよろしくお願いします。 ソースは以下の通りです。 #include "stdafx.h" #include <stdio.h> #include <string.h> #include <stdlib.h> unsigned short crc_cal(unsigned short lng, unsigned char *str) { unsigned short crc, i, j, t; t= 0x0000; crc = 0xffff; for (i = 0; i < lng ; i++) { crc ^= (unsigned short) str[i]; t = (unsigned short) str[i]; for (j = 1; j <= 8; j++) { if (crc & 1) { // carry bit on crc = crc >> 1; crc ^= 0xa001; } else { // carry bit off crc = crc >> 1; } } } return crc; } int main(void) { unsigned char str[256],data[128],hexstr[3]; unsigned short crc,CRC,len; while(1) { printf("Please input key (HEX)\n"); scanf("%255s",str); hexstr[2]='\0'; for(len=0; len<(strlen(str)/2) ;len++) { hexstr[0]=str[len*2]; hexstr[1]=str[len*2+1]; data[len]=(unsigned char)strtol(hexstr, NULL, 16); } crc = crc_cal(len,data); CRC = (crc>>8) | (crc<<8); printf("\nCRC16 = %04X\n\n", CRC); } return 0; }

  • error C2664

    現在VisualStudio C++ 6.0にてプログラムを組んでいるのですが、以下のようなエラーが出ます。 型の変換ができていないであろうことはわかるのですが、解決方法がわかりません。 どのような解決方法があるのでしょうか? よろしくお願いします。 error C2664: 'strcat' : 1 番目の引数を 'unsigned char [256]' から 'char *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。

  • Java バイナリデータの扱い

    既出でないことを確認してみたつもりです。 <やりたいこと> 1.バイナリデータに埋め込まれたデータを読み込みたい。 2.バイナリデータの並びは例えば double d1,d2; char buffer[256]; int i1, i2; などとなっていてファイルヘッダとして同じフォーマットのファイルには全て埋め込まれています。これを読み込みたいです。 <質問> C言語であれば例えば構造体を定義してやって構造体のポインタに対して ヘッダの読み込みを行ってやれば上記のdoubleなどの変数は参照できる ようになりますが、Javaで同等の処理をやろうとするとどうすれば 良いのかわかりません。 良い方法があれば教えて下さい。宜しくお願いします。

    • ベストアンサー
    • Java
  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。