- ベストアンサー
パック形式データをアンパックできません
質問No2513162の質問と同じですが、回答通りの方法でやってみるのですが一部うまくゆきません。 パック10進は1バイトに2桁数値が入っていますよね。その値が「00」から「80」までは変換するのですが、それ以上になると変換できません。 どなたかご教授願います
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> chr= Right(tmpREC.TANKA, 1) (left midも使います) 「tmpREC.TANKA」はString型なのでしょうか? どうやって、値が設定されているんでしょうか? VB2005ですが、 ------------------------------------------------------ Dim 上位桁, 下位桁 As Integer Dim TANKA As String Dim ch As String TANKA = Chr(&H81) ch = Microsoft.VisualBasic.Right(TANKA, 1) 上位桁 = Int(Asc(ch) / 16) 下位桁 = (Asc(ch) / 16 - 上位桁) * 16 MsgBox(上位桁.ToString & "," & 下位桁.ToString) ------------------------------------------------------ とすると、00になりますが、 ------------------------------------------------------ Dim 上位桁, 下位桁 As Integer Dim TANKA As String Dim ch As String TANKA = ChrW(&H81) ch = Microsoft.VisualBasic.Right(TANKA, 1) 上位桁 = Int(AscW(ch) / 16) 下位桁 = (AscW(ch) / 16 - 上位桁) * 16 MsgBox(上位桁.ToString & "," & 下位桁.ToString) ------------------------------------------------------ とすると、81になります。 「tmpREC.TANKA」に代入する際に既に文字コードが破損しているのかも・・・ #Stringではなく、Byte配列にした方が安全そうですね。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
> このロジックで行うと、16進の00から80まではうまく変換できますが、それ以外は変換結果は「ゼロ」になってしまいます。 packed decimal の81~99がうまく変換できないということですよね? VBのASC関数の引数は「文字」でそれに対応する値を返すということになっていますが、 日本語版の場合、0x81~0xA0 はShiftJISの上位バイトと重なってしまうので 引数が0x81~0x99のときには不正なキャラクタが来たと見てしまうのではないでしょうか? VB6ならASCB を代わりに使えばよさそうですがどうでしょうか? VB.NET以降はこの関数がないのでその対処も必要なようですが。 VB 基礎編 (その六) 文字列操作 chr、str、trim、left、mid、len、instr、format - SAK Streets http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_k06.htm VB6.0 の○○は、VB.NET ではどうなった - VBレスキュー(花ちゃん) http://hanatyan.sakura.ne.jp/dotnet/vb6tonet.htm > ご教授願います ×教授 ○教示
お礼
早速のご教示(字も間違えてた(^^;))ありがとうございます。現在はVB.NETを使ってます。アドバイスの通り、対処法としては、テーブルを作って1つひとつ変換しなければならないかと思っています。 何分にもVB初心者のため更なる勉強が必要だと思っています。今後とも宜しくお願い申し上げます。 ありがとうございました。
- dsuekichi
- ベストアンサー率64% (171/265)
> 質問No2513162の質問 の > 回答通りの方法 で、実際には、どういうプログラムを作成したんでしょうか? また、 > その値が「00」から「80」までは変換するのですが、 の「80」とは、10進数の80の事でしょうか?それとも、16進数の&H80の事でしょうか? > それ以上になると変換できません。 変換できないとは、どういう状況でしょう? エラーが発生するんでしょうか?それとも、思っていた値にならないのでしょうか?
お礼
説明不足ですみません。 プログラム(言語はVB)は、売上データ(パック形式)を読み込んで一覧表を作成する・・・といった単純なものです。“単価”を例に説明します。単価は3バイトなので、1バイト取り出して3回繰り返して最後に連結しています。 Dim 上位桁, 下位桁 As Integer Dim chr As String chr= Right(tmpREC.TANKA, 1) (left midも使います) 上位桁 = Int(Asc(chr) / 16) 下位桁 = (Asc(chr) / 16 - 上位桁) * 16 このロジックで行うと、16進の00から80まではうまく変換できますが、それ以外は変換結果は「ゼロ」になってしまいます。 VBは初心者なのでよろしくお願いします。
お礼
アドバイスありがとうございました。 思った通りの結果を出すことができ、大変助かりました。 まだまだ知らないことだらけですのでこれからもよろしくお願いいたします。