chr(&h81)〜のパック変換について

解決


パックマン  2008-01-29 19:28:06  No: 100157  IP: 192.*.*.*

現在、数値をパック10進数に変換する処理を開発しています。

方法としては、数値二桁ずつを取り出し、例えば"43"なら"chr$(&h43)"というふうに変換しています。

ここで問題が発生しました。81(chr$(&h81))から99(chr$(&h99))については
すべて"00"になってしまいます。
どなたかご存じの方、対処方法を教えて頂けますでしょうか?

編集 削除
大吉末吉  2008-01-29 20:24:35  No: 100158  IP: 192.*.*.*

&H81〜&H99は、Shift-JISでは、全角文字(漢字等)を表す2バイトコードの一部です。
単独で指定した場合、「正しい文字」とは看做されません。


「文字列」ではなく、「バイト型配列」で処理してはどうでしょうか?

編集 削除
パックマン  2008-01-30 11:01:14  No: 100159  IP: 192.*.*.*

>大吉末吉さん

早速のご返答ありがとうございます。

はずかしいお話なのですが、
「バイト型配列」で処理
というのは具体的にどのようにするのでしょうか?

編集 削除
大吉末吉  2008-01-30 11:22:48  No: 100160  IP: 192.*.*.*

> 具体的にどのようにするのでしょうか?

> 数値をパック10進数に変換する処理
変換してどうするかによりますので・・・

例えば、
---------------------------------------
    Dim s As String
    Dim b() As Byte
    Dim i As Long
    s = "1234567890"
    ReDim b(0 To Len(s) / 2 - 1)
    For i = 1 To Len(s) Step 2
        b((i - 1) / 2) = CByte("&H" & Mid(s, i, 2))
    Next

    Dim fn
    fn = FreeFile()
    Open "C:\out.txt" For Binary As fn
    Put #fn, , b
    Close #fn
----------------------------------------
こうすれば、ファイルに、16インコードで
12 34 56 78 90 
が出力されます。

編集 削除
パックマン  2008-01-30 11:36:48  No: 100161  IP: 192.*.*.*

>大吉末吉さん

度々のご返信ありがとうございます。

大吉末吉さんより教えて頂いた方法でできました。
まさに、テキストファイルに出力する処理を開発中なのです。
しかし、Open時に「BINARY」としてしまうとほかの値もBINARYになってしまいますよね?
何か、この変換した部分だけをテキストファイルに出力する方法は
ないでしょうか?

何度も申し訳ありませんが、宜しくお願いします。

編集 削除
大吉末吉  2008-01-30 13:52:15  No: 100162  IP: 192.*.*.*

テキストファイルとして出力する場合、一旦文字列に変換されます。
そうすると、元の木阿弥です。

思いつく方法は・・・
(方法1)
OutputモードでOpenして、通常の文字を出力する。
パック変換部分になったら一旦Closeし、BinaryでOpenしなおす。
ファイル末尾にSeekで移動して、パック変換部分を出力。
また、CloseしてOutputモードでOpenしなおして、通常の文字列を出力
・・・を繰り返す

(方法2)
BinaryでOpenし、通常の文字列も一旦Byte配列に変換してからバイナリーで出力

方法2の場合、例えば、
------------------------------------
    Dim fn
    fn = FreeFile()
    Dim b2() As Byte
    Open "C:\out.txt" For Binary As fn
    b2 = StrConv(",あいうえお", vbFromUnicode)
    Put #fn, , b2
    Close #fn
------------------------------------
の様にすれば、Binaryモードで文字列が出力されます。

編集 削除
大吉末吉  2008-01-30 14:10:55  No: 100163  IP: 192.*.*.*

一点訂正。

> また、CloseしてOutputモードでOpenしなおして、通常の文字列を出力

「Output」でOpenしなおしたら、今までの出力が消えてしまいますね。
「Append」の間違いです。

編集 削除
パックマン  2008-01-30 17:06:34  No: 100164  IP: 192.*.*.*

>大吉末吉さん

何度もありがとうございます。

教えて頂きました方法2で実現することができました。
ありがとうございました。大変助かりました。

また、宜しくお願い致します。

編集 削除
パックマン  2008-01-31 15:49:33  No: 100165  IP: 192.*.*.*

解決です。

編集 削除