今日の質問/マイページに反映されないので、再度の質問です。
windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

dim s as string


dim b() as byte

'文字列 -> byte配列
b = s

'byte配列 -> 文字列
s = b

この回答への補足

todo36さん さっそくの回答どうもありがとうございます。

"="で型変換できるとは驚きです。

下記のテストをしてみました。

Private Sub Command1_Click()

Dim byt1() As Byte
Dim str1 As String

Open "c:\data\in.csv" For Binary Access Read As #1
Open "c:\data\ou.csv" For Binary Access Write As #2

ReDim byt1(1)
Get #1, , byt1
ReDim byt1(21)
Get #1, , byt1
str1 = byt1
MsgBox ("< " & str1 & " >")
ReDim byt1(1)
byt1(0) = &HFF
byt1(1) = &HFE
Put #2, , byt1
ReDim byt1(21)
byt1 = str1
Put #2, , byt1

Close #1
Close #2

End Sub


sjis対応以外の文字もそのまま出力されることは確認しました
BOMの2バイトを含め24バイトのファイルを入出力しました
ただ、何が稚拙なのか、24バイトのあとに142バイトのゴミがついて出力されました。どこに問題があるのでしょうか。何か判りますでしょうか。 

補足日時:2003/10/23 15:54
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2003/10/23 22:48

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA バイナリ―から文字列にする方法

この度はお世話になります。

現在、バイナリ―ファイル(xxxx.bin)をVBAで読み込み、バイナリ―データを文字列化して、エクセルで解析できるようなシートを作っています。

バイナリ―ファイルの中身が31 39 32 31 ・・・・・となっていたら、31393231・・・と文字列化にしたいです。
そこで、自分でプログラムを考えてみたのですが、バイナリ―が 01 などの場合、など“1”として読み込まれて、“0”が入らず、ずれてしまいます。

Sub 電文解析プログラム()

Dim Deciphering_file As Variant '読み込みファイル
Dim buf As Byte '1バイト格納
Dim fLen As Long 'ファイルサイズ
Dim TEMP(1) As String '
Dim S_JIS As String '文字コード(2バイト)
Dim str As String '文字列データ
Dim i As Long

Deciphering_file = Application.GetOpenFilename("BINファイル(*.bin),*.bin")

fLen = FileLen(Deciphering_file)

Open Deciphering_file For Binary As #1

For i = 1 To fLen
Get #1, i, buf
S_JIS = Hex(buf)

If buf = 0 Then
S_JIS = "00"
End If

TEMP(0) = Mid(S_JIS, 1, 1)
TEMP(1) = Mid(S_JIS, 2, 1)

str = myChr & TEMP(0) & TEMP(1)
Next i
End Sub


ホントは3行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。

この度はお世話になります。

現在、バイナリ―ファイル(xxxx.bin)をVBAで読み込み、バイナリ―データを文字列化して、エクセルで解析できるようなシートを作っています。

バイナリ―ファイルの中身が31 39 32 31 ・・・・・となっていたら、31393231・・・と文字列化にしたいです。
そこで、自分でプログラムを考えてみたのですが、バイナリ―が 01 などの場合、など“1”として読み込まれて、“0”が入らず、ずれてしまいます。

Sub 電文解析プログラム()

Dim Deciphering_file As Variant '読み込みファイ...続きを読む

Aベストアンサー

「"0" & Hex(buf)」でできる文字列の右側2文字を取ればOKです。

S_JIS = Right("0" & Hex(buf), 2)


"0" & Hex(255) → "0FF"
右側2文字を取ると"FF"

"0" & Hex(5) → "05"
右側2文字を取ると"05"

QVBAのバイナリ出力について

この度はお世話になります。
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文字を取り出して・・・書き込む?ような感じなのですが
それをプログラムに起こす書き方がわからず困っています。

申し訳ございませんが、ご教授よろしくお願いします。。。

この度はお世話になります。
VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。

エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが
思った出力が出ないでいます。

エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。

そこで、まずはtxtで書き出せるかやってみまして・・・
Sub test()

fnsave = "1.txt"

Worksheets("Sheet1").Activate

numff = FreeFile

Open fnsave For Output As #num...続きを読む

Aベストアンサー

akichan1jp さん
こんにちは。
次のプログラムでできると思います。

Sub test()
 TEMP = Worksheets("Sheet1").Range("C3")
 ReDim BIN(Len(TEMP) / 2 - 1) As Byte
 For I = 1 To Len(TEMP) Step 2
   BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
 Next I
 Open "1.BIN" For Binary As #1
 Put #1, , BIN
 Close #1
End Sub

注)"1.BIN"は事前に削除した方が安全です。
  例えばファイルの大きさが小さくなると、前のファイルの大きさがに維持されてしまいます。
  ご注意ください。

ご確認下さい。

QVisual Basic でのコードをASCII変換、16進変換したものを元に戻す方法を教えてください

string(9)のエリア"Aa1アあa "の文字を1文字ずつASCII変換して、16進変換し、string(18)のエリアに格納します
すると"416131B182A08281202020"と変換されます
(一文字ずつ Hex(Asc(Buf))を使用しました)

逆に、"416131B182A08281202020"を"Aa1アあa "に戻したいのですが、
どのような関数を使えばよいのかわかりません。
困っています。教えてください。よろしくお願いいたします。

Aベストアンサー

VB既存の関数ではできないと思うので、自分で関数を作るなりしてください。

ヒントです。
ASC関数により変換された2バイト文字(シフトJIS)の1バイト目は81~9FおよびE0~FC(すべて16進)になります。
16進数から10進数に戻すには、頭に"&H"をつけます。(&H82A0 = 「あ」のシフトJISコード)
文字を数字に変換するのはVal関数、数字(文字コード)から文字に変換するのはChr関数です。

QVB6で配列を文字列に変換する方法?

VisualBasic6を使っております。

Dim ary() As Byte
Dim s as String

配列を文字列に変換したり、文字列を配列にしたいのですが
どのようにすれば良いのでしょうか?

Aベストアンサー

VBでは、そのまま変数に入れるだけです。

Dim ary() As Byte
Dim s as String

ary = "文字列"
s = ary

'ウォッチウィンドウで変数を見てください。
'以下のように表示されます
ary
ary(0)=135
ary(1)=101
ary(2)=87
ary(3)=91
ary(4)=23
ary(5)=82
s="文字列"

Qバイト型のデータをLong型に変換

初歩的なことですみません。

Dim a(0 to 3) as Byte
Dim b as Long
と宣言します。
この変数aをLong型のbに変換するにはどのように
したらよいのでしょうか?
逆にbの値をaに変換する方法もできましたらお願いします。

Aベストアンサー

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
MoveMemory a(0), b, 4
MoveMemory b, a(0), 4

--
(2)が手堅く応用が利くかと。
(3)はlongならいいが、4の倍数でない型は問題あるかも。

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (D...続きを読む

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

Q[VB.net] StringからByte配列への変換

皆さんこんばんは。
最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。
VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。


CByte( Mid(str,i,1) )
CLng( Mid(str,i,1) )

他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。
("『"を上下反転したような文字)


ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。

よろしくお願いします。

Aベストアンサー

Option Explicit On
Option Strict On
Option Compare Binary
Option Infer Off ' VB2008以上。
Class Q3512824

Shared Sub Main()
Dim Str1 As String = "ほげふが"
Dim ByteArray1 As Byte()
'Code Page 932 = Shift_JISもどき
'Code Page 65001 = UTF-8
ByteArray1 = System.Text.Encoding.GetEncoding(65001).GetBytes(Str1)
For Each Byte1 As Byte In ByteArray1
System.Console.WriteLine(Byte1.ToString)
Next
End Sub
End Class

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qバイト配列 抜き出す

はじめまして。

VB6.0 MSCommを使用して,44バイトのデータを受信するプログラムを作成中です。
ここで質問なのですが,
44バイトのデータをバイト配列に格納するまでは良いのですが,必要なデータは(10バイト目~14バイト目)のデータしか必要がありません。この必要な部分だけ切り出せる関数などはありませんか?
宜しくお願いします。

Aベストアンサー

ANo.2です。

書き方が悪かったみたいですみません。
d = MidB(d, 10, 5)
だけが言いたかった事です。

>44バイトのデータを1バイトずつ配列に入れているのですか?
そうです、質問で
>44バイトのデータをバイト配列に格納するまでは良いのですが
とあったので、前半部分はサンプルデータを作っています。
後半部分は結果表示です。

>10バイト目から5バイト分 d配列に入れてますか?
そうです。
別のバイト配列を用意すれば良かったのですが、こんな風にできるというサンプルなので。

p.s.
実際にはvbaで覚えた方法なんですが、いったん文字列変数に代入すると、前から取り出して後に追加するとかの処理が楽です。
ただし、midbでなくmidの場合など、文字コードが関係する文字列操作関数を使うとおかしくなる場合がありますので、気を付けてください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報