アプリ版:「スタンプのみでお礼する」機能のリリースについて

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
これでやっとできました。

この他にも方法があるのか?と思い、質問させていただきました。
ご指導よろしくお願いいたします。

A 回答 (2件)

1バイトしか出力していないから。


ReDim ByteData(1) As Byte
ByteData(0) = AscW("A")
Open "C:\A.txt" For Binary Access Write As #1
Put #1, , ByteData
このように要素数2の配列を出力すれば良い。

と言うか、コード変換はStreamオブジェクトを使うべきです。
Dim S, U
Set S = CreateObject("ADODB.Stream")
S.Open
S.Type = 2 '★テキストモード
S.Charset = "Shift_JIS" '★SHIFT-JIS
S.WriteText "A" '★文字列を書き込む
Set U = CreateObject("ADODB.Stream")
U.Open
U.Type = 2
U.Charset = "UniCode"
S.Position = 0 '★ファイル位置を先頭に戻しておく
S.CopyTo U '★コード変換する
U.SaveToFile "C:\OK\U.txt", 2 '★ファイルに保存
S.Close
U.Close

出力ファイルの先頭には文字コードを示すBOM(2バイト)が付加されます。
これがイヤなら、次のようにBOMを避けて、自分のデータに読み込み、
これを出力します。

S.CopyTo U '★コード変換する(ここまで同じ)
U.Position = 0 '★先頭に戻す
U.Type = 1 '★バイナリモード
ReDim B(U.Size - 1) As Byte '★全データ長を定義
U.Position = 2 '★BOMを避けて3バイト目へ位置付ける
B = U.Read '★全データをバイト配列へ読み込む
Open "C:\A.txt" For Binary Access Write As #1
Put #1, , B '★ファイルへの書き込み
Close #1

UniCodeの他、UTF-8など、登録されている文字コードなら相互に
変換することができます。
    • good
    • 1

' ByteData は Byte型 (1 Byte)


Dim ByteData As Byte

' Unicode 文字セットの "A" を Byte型(1 Byte)にセット
' A は ASCIIコードで &h41 (10進で 65)
ByteData = AscW("A")

' ファイルをバイナリファイルの書込みモードでオープン
Open "C:\A.txt" For Binary Access Write As #1

'ファイルの1バイト目に Byte型(1 Byte)の値をセット
'バイナリエディタで見ると 41 と見える
'(バイナリエディタが 16進表記の為)
'当然 "J" だった場合、4A と見える
Put #1, 1, ByteData

'ファイルの1バイト目に Integer型(2 Byte)で 10進数の
'41 をセット、 41の16進は、&h29 で、integer型の為
'バイナリエディタで見ると [29 00]が入る
'[29 00 20 20]になったとなるのなら、先にA.txtを削除して
'確認すること(前の情報が残っていると思われる)
'当然ながら、先の"J"の場合の、4A はエラーになる
Put #1, 1, 41


'ファイルの1バイト目に char型で 2文字 "41"をセット
'文字の 4 は ASCIIコードで &h34 (10進 で 52)
'文字の 1 は ASCIIコードで &h31 (10進 で 49)
'バイナリエディタで見ると [34 31]が入る
'[34 31 20 20]になったとなるのなら、先にA.txtを削除して
'確認すること(前の情報が残っていると思われる)
Put #1, 1, "41"


'ファイルの1バイト目に long型(4 Byte)で (CLng で long型に変換した為)
'で、&h41 をセット、long型の為 [41 00 00 00] が入る
'当然ながら、CLng("&H" & 4A) とするとエラー CLng("&H4A")ならOK
Put #1, 1, CLng("&H" & 41)

'Byte型(1 Byte) の変数に、long型( 4 Byte )の値をセット
'その後、1Byte を書き込む
'当然ながら、CLng("&H" & 4A) とするとエラー CLng("&H4A")ならOK
ByteData = CLng("&H" & 41)
Put #1, 1, ByteData

'ファイルクローズ
Close #1

最後のやり方のように、Byte型に格納して書き込むやり方で良いと思いますが
Chr$ で 1文字に変換してセットで良いかも知れません
Put #1, 1, Chr$(CInt("&H" & 41))
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています