• 締切済み

バイナリーデータを16進数に表示したい

バッファーにパックされたデータが入ってきます。 そのデータを1バイトずつHEXで表示したいのですが VB.NETでプログラミングしているのですが苦戦しています。 H01,H10,H20...等はしたコーディングで表示できるのですが HC5,HCA,E0等の上位4ビットが大きいと全て3Fとなって期待した表示ができません。 メモリーダンプして1バイト毎に16進数(0~F)で表示したいのと同様で、1バイトを変換しないでそのままHEX表示したいです。 下はうまく動かないサンプルです。開発言語はVB.NETです。 ------------------------------------ InBuffer = _Rfid.ReadExisting() hexData = "" For i = 0 To Len(InBuffer) - 1 hexData = hexData & Hex(Asc(Mid(inData, i + 1, 1))).PadLeft(2, "0"c) Next ----------------------------- どなたか方法をご教示ください。 宜しくお願いします。

みんなの回答

回答No.1

SerialPortクラス使った事ないから自信ないけれども。 http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting.aspx 戻り値はStringでいいのか? http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.encoding.aspx Stringで正しいとしてEncodingは正しいのか? System.Text.Encoding.GetEncodingメソッドの EncoderFallbackやDecoderFallbackはちゃんとしているか? =============== http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readbyte.aspx http://msdn.microsoft.com/en-us/library/ms143549.aspx もし、StringでなければReadByte()やRead(Byte[],Int32)メソッドだよね? http://msdn.microsoft.com/en-us/library/system.bitconverter.getbytes.aspx http://msdn.microsoft.com/en-us/library/system.bitconverter.tostring.aspx ReadByte()を使うなら、BitConverterクラスのgetbytesメソッドから ToStringメソッドでいけるかな。

関連するQ&A

  • 文字型変数を使って2進数表示すると、最上位ビットに1を立てると値に-記号が入ってしまいます

    VB6.0 WindowsXP 掲題の件ですが以下のコードを使って16進数を2進数表示にしていますが、最上位ビットに1を立てると値がおかしくなってしまいます。 Private Sub Form_Load() Dim dat(5) As Variant Dim i As Variant dat(0) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFF)), 16) dat(1) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFE)), 16) dat(2) = Right("0000000000000000" & Hex2Bin(Hex(&HFF00)), 16) dat(3) = Right("0000000000000000" & Hex2Bin(Hex(&HF000)), 16) dat(4) = Right("0000000000000000" & Hex2Bin(Hex(&HF0F0)), 16) dat(5) = Right("0000000000000000" & Hex2Bin(Hex(&H7FFF)), 16) For i = 0 To 5 Label1.Caption = Label1.Caption & dat(i) & vbCrLf Next Label2.Caption = "FFFF" & vbCrLf & "FFF0" & vbCrLf & "FF00" & vbCrLf & "F000" & vbCrLf & "F0F0" End Sub Public Function Hex2Bin(Hex) Dim Dec Dec = CInt("&H" + Hex) Hex2Bin = Dec2Bin(Dec) End Function Public Function Bin2Hex(Bin) Dim Dec Dec = Bin2Dec(Bin) Bin2Hex = Hex(Dec) End Function Public Function Dec2Bin(ByVal Dec) Do Dec2Bin = CStr(Dec Mod 2) & Dec2Bin Dec = Dec \ 2 Loop Until Dec = 0 End Function Public Function Bin2Dec(Bin) Dim i As Integer For i = 1 To Len(Bin) Bin2Dec = Bin2Dec * 2 + CInt(Mid(Bin, i, 1)) Next End Function なぜこうなってしまうのか、最上位に1を入れても1000000000000 のように表示させるにはどうしたらよいか教えていただきたいです。 よろしくお願いします。

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

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

  • 教えてください。VBでのバイナリデータ。

    EUCコードで作成されたlndatファイルをオープンし、 コード変換するプログラムを作っています。 データの所得時にHexを使っているのですが、 所得データが 000000000000000000220801011200012000 となっています。 元データは 000000000000000000000000000000000000220080010001012000000120000000000000 なため、この様に所得したいのですが、上手く所得できません。 こういったデータの所得は可能なのでしょうか? また、自分の作成したソース自体にバグがあるのでしょうか? よろしかったら教えてください。 >>以下ソース Dim Data As Byte     '所得データ(1バイトごと) Dim Data_A As Variant 'ファイルから所得したデータ(ALL) Dim I As Long 'カウンター Dim File_Name As String 'ファイル名 Dim Filnm As Long 'ファイル番号 I = 1 Data_A = "" Filnm = FreeFile File_Name = "AA.lndat" Open App.Path & File_Name For Binary As #Filnm Do While EOF(Filnm) = False Get #Filnm, I, Data Data_A = Data_A & Hex(Data) I = I + 1 Loop Close #Filnm >>開発環境 VB5.0(SP3) Win2000 フリーのDLL等は使用不可能とお考え下さい。

  • またまたバイナリ→テクスト

    VBは5で、Excle2000のVBAでやってます。バイナリデータ→テクストデータに 128バイナリデータを添え字を使って1バイトごとに抽出DATA_PS = DATA_PS & 変換関数 というふたつの部分のリファレンスが正しくかけなくて 困ってます。Getを使って1バイトづつとりだして、Hexを使って変換するというものだそうです。 誰か教えてください。

  • VB6.0でのバイナリデータの扱いについて

    現在ハンディターミナル(HT)とPCとの通信を行うプログラム(VB6.0)を作成しています。 このプログラムは元々VB2.0で作成されたものをベースとしてVB6.0で再作成しているものです。 プログラムの中でHTとPCとの通信エラーを防ぐため、データ行のBCCを計算しHTに送信している 部分があります。VB6.0ソースを下に表示します。 (実際は、計算したBCCをデータ(下のCheckString変数)の最終行にくっつけてHTに送信していますが、ここではBCCのみ送信しています) -------------------------------------------------○VB6.0 /* 最初にBCCを計算して返し、HT側へ送信している */ /* BCCはstring */ Dim i As Integer, aa As Integer,BCC as String aa = 0 For i = 1 To Len(CheckString) aa = aa Xor Asc(Mid(CheckString, i, 1)) Next BCC = Chr$(aa) frmMain.MSComm1.InBufferCount = 0 frmMain.MSComm1.Output = BCC ------------------------------------------------ VB2.0ではAscB,LenB,MidBのところをVB6.0ではAscB,LenB,MidBをAsc,Len,Midへ変更しています。通常はこれで問題ありませんでしたが、BCCの計算の結果aa = 226となった場合にBCCに文字化けした"r"のような文字がはいっていました。プログラムの中でBCC変数をテキストへ吐き出し、バイナリエディタで確認しましたが"E2"となるところに"00"と空白となっており、これが原因でHTとPC間での通信が完了しません。 (テキスト送信時にStringのため文字化けが原因?) 前回の質問でSTRING型を使用せずにバイナリ型配列で処理する事や、いままで暗黙のうちにUnicode⇔SJIS変換を行ってくれていた部分をStrconvを使用し自前で処理しなければいけないというご指摘を受けたのですが、上のプログラムではどのように修正が必要なのでしょうか?どなたかご教授の程宜しくお願い致します。

  • 【VB6.】10進数を16進数に変換(符号つき)

    お世話になります。 どうしてもわからないので教えてください。 やりたいことは以下です。 ●DecをHexの符号ありに(1byte)変換 ●結果としてDec「-02」を変換してHex「FE」が欲しい。 -128~127(変換後は80~7F)まで200通り以上あるので自動変換したいです。 使用しているインターネットのサイトだとできますが、VB6のプログラムで書くとうまくいきません。 ネットに繋がらない環境で変換しなくてはいけなくなったので、どなたか助けてください! お願いします。

  • 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 となってしまいます。 なぜなのでしょうか? また、他によい方法はありますでしょうか? ご指導よろしくお願いいたします。

  • 漢字の見分け方

    教えて下さい。 VBでMDB上のデータを漢字とそれ以外に分けたいのですが、 S-JISコードの漢字の範囲で判断しているつもりなのですが 上手くいきません。 以下のようなロジックなのですが? If (Hex(Asc(Mid$(work, idx1, 1))) >= &H8140 And Hex(Asc(Mid$(work, idx1, 1))) <= &H9FFC) Or (Hex(Asc(Mid$(work, idx1, 1))) >= &HE040 And Hex(Asc(Mid$(work, idx1, 1))) <= &HEFFC) Then このIF分に引っかからないのですが。 workはMDBのテーブルを読み込んだ1フィールドです。 宜しくお願いします。

  • VBへの変換の仕方 RS232C送信データとチェックサム

    以下のプログラムをVBに変換する仕方を教えてください。 サンプルプログラム 1110 CHKSUM=0 1120 FOR i=1 to LEN(A$)      'A$は送信データ 1130 CHKSUM=CHKSUM+ASC(MID$(A$,i,1) 1140 NEXT i 1150 C$=CHR$((CHKSUM+13) MOD 256) 1160 PRINT #1,A$;CHR$(13);C$; 私のVBプログラムは1110行から1150行まではそのままで CHKSUM=0 FOR i=1 TO LEN(A$) CHKSUM=CHKSUM+ASC(MID$(A$,i,1) NEXT i C$=CHR$((CHKSUM+13) MOD 256) としました。 送信部分を MSComm1.Output =A$ & CHR$(&H13) & C$ としてみましたが 1160行にあるセミコロン ";" はCHR$(&h3B) として送る必要があるのでしょうか? MSComm1.Output =A$ & CHR$(&h3B) & CHR$(&h13) ・・・・・・ また、データとしてA$="I 02"のチェックサムは "リ" となりますが正しいのでしょうか? 以上ご教示ください。

  • バイナリファイルのデータから特定の番地のHEXデータの表示方法

    現在、バイナリファイルのデータから特定の番地のデータだけをテキストボックスに表示させたいというプログラムを作成しております。 特定番地は0x1F65番地~の6バイトを抜き出し、そのHEXデータをテキストボックスにそのHEXがわかるテキストデータとして表示させたいと考えているのですが、この場合どのようにコーディングしたらよいのでしょうか。 現在のプログラムは private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { //指定したファイル名でStreamReaderを設定する try{ System::IO::StreamReader^ sr = gcnew System::IO::StreamReader("sample.bin"); //受け皿 array<wchar_t>^ buf=gcnew array<wchar_t>(6); //先頭から0x1f63バイト動かす sr->BaseStream->Seek(0x1f65,System::IO::SeekOrigin::Begin); //2バイト読み込む sr->Read(buf, 0, buf->Length); //此処でテキストボックスに入れる this->textBox1->Text= gcnew System::String(buf); } catch(System::Exception^ ex){ System::Windows::Forms::MessageBox::Show(ex->ToString()); } //this->textBox1->Text = L"変更1"; this->textBox2->Text = L"変更2"; this->textBox3->Text = L"変更3"; } コマンドボタンを押して、特定番地をBUFに入れた後テキストボックスに代入しています。これだとAsciiコードに準じたの文字が表示されてしまうので、そのHEX番号がわかるようにテキストボックスに入れたいとおもっています。 どうぞ、ご教授よろしくお願いいたします。

専門家に質問してみよう