ACCESS VBAでのバイナリデータ操作について

このQ&Aのポイント
  • ACCESS VBAでバイナリデータを操作する際、全角空白がある場合に正しくコードを取得できない問題が発生します。
  • バイナリモードでの確認では、全角空白の文字コード「00」を取得できず、代わりに他の文字コードが取得されます。
  • バイナリデータの正確な操作を行いたい場合は、他の方法を見つける必要があります。
回答を見る
  • ベストアンサー

ACCESS VBA でのバイナリデータ操作について

ACCESS VBA でのバイナリデータ操作について いつも参考にさせていただいております。ありがとうございます。 テキストファイルがあるとし、 日本語(UTF-16 BE)で   あいう というデータとします。 バイナリモードで確認すると、 30 42 30 44 30 46 と表示されます。 この文字コードを使って文字を生成したいのですが、 http://support.microsoft.com/kb/404928/ja 上記を参照し、 ByteData = InputB(6, #1) ChrB(cint("&H" & Hex(ByteData(1)))) & ChrB(cint("&H" & Hex(ByteData(0)))) という方法で「あ」を生成させることはできたのですが、 全角空白があった場合、ただしくコードを取得させることができません。 たとえば、「あ う」(←[あ]と[う]の間が全角空白です)の場合、 バイナリモードで確認すると、 30 42 30 00 30 46 なのですが、「00」を取得することができず、 hex(ByteData(0)) = 30 hex(ByteData(1)) = 42 hex(ByteData(2)) = 30 hex(ByteData(3)) = 30 hex(ByteData(4)) = 46 となってしまいます。 なぜなのでしょうか? また、他によい方法はありますでしょうか? ご指導よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.3

今読み返しててふと思ったのですが・・・ >InputB(6, #1) >↓ >InputB(5, #1) >に変更し、Hex(ByteData(5))の部分も削除し、再度実行させ、そこで判明したものです。 エディタで確認した際は 「00」が存在して、インプットする時点で落ちる(バイナリを取得していない)ということは、この時点で既に全角スペース(全角空文字)を文字列として解釈してませんよね^^;(確かInputBの第一引数のナンバーって「バイト数を指定」でしたよね。) っとなると、全角スペースの文字コードはAC-VBAでは「文字コード」として解釈されないのかもしれません。(※AC-VBAで文字コード解釈出来ないバイナリデータを無視することを前提に話しています。) 上は推論で、完全に憶測の域を越えませんが・・・ 私にはこれ以上はお手上げです・・・>< お役に立てず申し訳ないです・・。

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます! Dim ByteData() As Byte Open "テキストファイル名" For Input As #1 Do While Not EOF(1)  ByteData = InputB(6, #1)  Debug.Print "確認(コード)" & Hex(ByteData(0)) & ":" & Hex(ByteData(1)) & ":" & Hex(ByteData(2)) _  & ":" & Hex(ByteData(3)) & ":" & Hex(ByteData(4)) & ":" & Hex(ByteData(5)) ・・・ 前回sykt1217様がご回答くださった「単純にInput」を試してみて、 その際にもバイト落ちしているのを見て、 もしかしたら上記InputBの段階で、ファイルをSHIFT-JIS扱いしてしまうのかなぁ?と 思いました。 http://support.microsoft.com/kb/404928/ja に、 「InputB 関数は、データをバイナリデータとしてみなして、Unicode への変換をおこないません。」 と記載があったので、読み込む際にバイナリデータとみなしてくれている(SHIFT-JISであろうがなんだろうが大丈夫!)と思ったのですが・・・ ふに落ちません。。 ですが、そうであれば、 シーケンシャル読みをせず、バイナリ読みをしてみよう!ということで、 ただいま検証中です。  Open strFullPass(1) For Binary Access Read As #inFileNo >私にはこれ以上はお手上げです・・・>< >お役に立てず申し訳ないです・・。 とんでもないです、おかげでケタ落ちが見えました!! 結果、再度ご報告いたします!

その他の回答 (3)

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.4

閉じないでいただけてうれしいです(笑) >Open strFullPass(1) For Binary Access Read As #inFileNo ですか^^ っとなると、 Get #inFileNo, , ByteData() で取得・・・で Chr(ByteData) で変換・・・で出来るのかなぁ・・・^^;

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます! お礼が大変遅くなり、申し訳ありません。 >Get #inFileNo, , ByteData() >で取得・・・で >Chr(ByteData) はい、その通りでした! Open strFullPass(1) For Binary Access Read As #inFileNo ReDim ByteData(FileLen(strFullPass(1)) - 1) Get #inFileNo, 1, ByteData() Close #inFileNo とし、ByteData(0) などとして処理することで、何とかなりそうです。 本当にありがとうございました!

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.2

お礼ありがとうございます。 バイナリデータとしてでなく、単純にインプットしてみたらどうなるでしょう? Dim intFile As Integer Dim strName As String Dim strTxtName As String intFileNum = FreeFile Open strTxtName For Input Access Read As #intFile Do Until EOF(intFile)   ' 行を変数に読み込みます。   Input #intFile, strName   Debug.Print strName Loop Close #intFile とりあえずこれで試してみてください。

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます! お礼が遅くなり、申し訳ありません。 単純にインプットすると・・・ 「0B00F」 となります。 というのも、ファイルがUTF-16(BOMなし、ビックエンディアン)で作成されているのですが、 単純にインプットすると、ファイルをSHIFT-JIS とみなして、 30->0 42->B 30->0 00->ない?? 30->0 46->F と変換し、00に対するSHIFT-JISコードがないので取得できないと思われます。 これを回避するために、InputBを使って取り込ませてみたのですが、 InputBでもダメ、ということなのでしょうか。。。 再度、ご指導よろしくお願いいたします!

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.1

ByteDataはByte型ですかね? バイナリはあまり使ったことがありませんが、 >バイナリモードで確認すると、 >30 42 30 00 30 46 これはどの段階でしょう? テキストファイルを開き、一行を読み込んだ際にでしょうか? またByteData()配列に、一行分のバイナリデータが全て格納されていますか? Unicodeではなく、ANSI形式で格納しても同じ結果になるでしょうか? まずはウォッチウィンドウを使って、「どこまで『00』が格納されているか」等を確認してみてください。

OK_Akiko
質問者

お礼

sykt1217様、ご回答ありがとうございます。 >ByteDataはByte型ですかね はい、その通りです。 >>バイナリモードで確認すると、 >>30 42 30 00 30 46 >これはどの段階でしょう? これはプログラムを通す前の、テキストファイルをエディタ(バイナリモード)で確認した際です。 テキストデータが正しいことを確認したものです。 はじめは、 Dim ByteData() As Byte Open "テキストファイル名" For Input As #1 Do While Not EOF(1) ByteData = InputB(6, #1) Debug.Print "確認(コード)" & Hex(ByteData(0)) & ":" & Hex(ByteData(1)) & ":" & Hex(ByteData(2)) _ & ":" & Hex(ByteData(3)) & ":" & Hex(ByteData(4)) & ":" & Hex(ByteData(5)) ・・・ と記載していたのですが、、 InputB(6, #1)の部分でエラーとなり、エラー内容が 「ファイルにこれ以上データがありません」 でしたので、なぜかな?と思い、 InputB(6, #1) ↓ InputB(5, #1) に変更し、Hex(ByteData(5))の部分も削除し、再度実行させ、そこで判明したものです。 ですので、ByteData()配列に入ってきていない、ということになります。 ご指導よろしくお願いいたします。

関連するQ&A

  • VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいの

    VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいのですが、 例えば、"A"が一文字のみのShift-JIS もしくはunicodeのテキストファイルを作るため、 (下記の確認はShift-jis で行っています。) Dim ByteData As Byte ByteData = AscW("A") Open "C:\A.txt" For Binary Access Write As #1 Put #1, 1, ByteData Close #1 としました。 できあがったファイルをバイナリエディタで確認すると、  41 となっています。 (Unicode は 41 00 2バイト文字でリトルエンディアンのため) この41は、"A" の文字コード(Shift-JIS)「65」の16進表記です。 この「41」という値を使ってバイナリモードでテキストファイルを作成したいのですが、 どのようにすればよいでしょうか? 上記 Put #1, 1, ByteData の部分を、 1.Put #1, 1, 41 としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「29 00 20 20」でした。 文字コード00 に該当する文字がないためだと思います。 2.Put #1, 1, "41" としたところ、「41 」(バイナリモードで 「34 31 20 20」) (41の後ろは半角空白) で×でした。 3.Put #1, 1, CLng("&H" & 41) としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「41 00 00 00」でした。 4.ByteData = CLng("&H" & 41) Put #1, 1, ByteData これでやっとできました。 この他にも方法があるのか?と思い、質問させていただきました。 ご指導よろしくお願いいたします。

  • バイナリデータの取り方

    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」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • php のバイナリデータ操作について

    php のバイナリデータ操作で詰まっています。 やりたいことは、バイナリファイルから読み込んだ2byteのデータを 4bitずつに取り出して、データをチェックしたいです。 マスクして、シフトしてと考えたのですが マスクの時点で意図するデータではなくなっています。 良い方法はありますでしょうか。 以下、試してみた結果です。 //2byteづつ読む $bin_data = fread( $handle, 2 );  ■bin2hex()の後にマスク $dataStr = bin2hex($bin_data); print ( $dataStr ); →結果 ABCD $mask = ($dataStr & "FFFF") ; print ( $dataStr ); →結果 @BBD $mask = ($dataStr & 0xFFFF) ; print ( $dataStr ); →結果 0  ■bin2hex()の後にマスク $mask_data = ( $bin_data & 0xFFFF ) ; $dataStr = bin2hex($mask_data); print ( $mask_data ); →結果 0 $mask_data = ( $bin_data & "FFFF" ) ; $dataStr = bin2hex($mask_data); print ( $mask_data ); →結果 文字ばけ

    • ベストアンサー
    • PHP
  • VBAでバイナリデータが上手く読めない。

    VBAでバイナリデータが上手く読めない。 もともとC言語でバイナリデータを加工していた事をVBAでやる事になったのですが、上手く読めない。 <VBA> Open inputFileName For Binary As #mFileNo のようにオープンして、 <VBA> Dim a(800) As Byte Get #1, , a のように記述すればC言語のように取得出来ると思ったのですが、上手く取得出来ません。 なんとなく分かった事ですが、800バイトの中に改行文字があった場合、そこまでを変数aに入れるようにすると出来そうなので、Getで改行コードがあった場合はそこまでを読み込むみたいな手段はありますでしょうか。inputだとデータがまったく見れませんでしたのでGetにて対応したいと思っています。 宜しくお願い致します。

  • 文字コード結果が違うのはなぜでしょうか?

    文字コード結果が違うのはなぜでしょうか? いつも参考にさせていただいております。ありがとうございます。 VBAにて、文字コード(16進表記)を取得したいのですが、 1.hex(ascw("あ")) 2.Dim ByteData() As Byte  ByteData = "あ" Debug.Print Hex(ByteData(0)) & Hex(ByteData(1)) の2通り行っているのですが、結果が違いました。 1.3042 2.4230 となってしまいます。 UNICODEのリトルエンディアン・ビックエンディアンの違いなのかとも思いましたが、 上記はどちらもVBAで行っているため、式によって扱いが違うとも考えられません。 この違いはなぜなのでしょうか? ご教授よろしくお願いいたします。

  • バイナリモードについて

    はじめまして。 VBでテキストの検索機能をプログラミングする上で 大/小文字、カナ/ひらがな、全角/半角を区別して検索する ためにバイナリモード(vbBinaryCompare)を使用すると思うのですが このバイナリモードはFTPなどで耳にするバイナリモードとは 意味合いが違うのでしょうか? よろしくお願いします。

  • VBAのバイナリ出力について

    この度はお世話になります。 VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。 エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが 思った出力が出ないでいます。 エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。 そこで、まずはtxtで書き出せるかやってみまして・・・ Sub test() fnsave = "1.txt" Worksheets("Sheet1").Activate numff = FreeFile Open fnsave For Output As #numff temp = Range("C3") Print #numff, temp Close #numff End Sub (Sheet1のセルのC3に512文字入っています。) これをOutputをBinaryにして・・・Putで書く? 多分2文字を取り出して・・・書き込む?ような感じなのですが それをプログラムに起こす書き方がわからず困っています。 申し訳ございませんが、ご教授よろしくお願いします。。。

  • C++でバイナリデータの扱い方

    以下のプログラムで接続先からバイナリデータを取得しているのですが coutで出力しても画面に何も表示されません。 ------------------------------------------------------ /*include部分は省きます*/ std::string bin; //1 clx::http session(clx::uri::encode(ip), 80); //2 session.get(clx::uri::encode(param)); //3 bin = session.body(); //4 std::cout << bin << std::endl; //5 ------------------------------------------------------ 上記プログラムを空ファイルにリダイレクトしバイナリエディタで見たら ちゃんとデータは書き込まれていました。 5行目を以下のように変えても空欄が出力されただけで文字は表示されませんでした std::cout << std::hex << bin << std::endl; しかし以下のようにすると文字数は表示されました。 std::cout << bin.length() << std::endl; やりたいこととしてはphpのpack()、unpack()的な部分です。 例えば 値をフォーマットを指定してバイナリデータとして出力 $val=pack("L", 35); とか バイナリデータを変数から指定バイト分取り出して10進数で画面に出力 $bin=(バイナリデータ); $val=unpack("c",$bin); echo(sprintf("%d",$val)); です。 バイナリの扱いはリトルエンディアンです。 ご教示お願いしますm(__)m

  • バイナリデータをダウンロードしたい

    いつもお世話になっております。 サーブレットをつかって、クライアントにバイナリデータをダウンロードできるようにしたいのですがなにかいい方法はないでしょうか? HttpServletResponseからOutoutStreamを取得してBufferedOutputStreameを生成してwriteしたのですが、ダウンロードではなく、ブラウザに表示されてしまいました。 いったいどうすればいいのでしょう? テキストデータ-だとヘッダーを宣言してPrintWriterから書きだせるのですが、、、

    • ベストアンサー
    • Java
  • javaバイナリ変換したデータのファイル出力

    現在、 String test_st = "0123456789abcdef"; というデータを byte[] bytes = test_st.getBytes("UTF-8"); このコードでバイナリ変換したのですが、このbytesに格納したバイナリデータたバイナリファイルとして出力したいのですが、どのようにしたらよいかご教授よろしくお願い致します。 BinaryFileWriter writer = new BinaryFileWriter(); このようなコードで出力できるとのサンプルもあったのですが、うまくいきません。 どうぞ、よろしくお願い致します。

    • ベストアンサー
    • Java