- 題名: 構造体データのバイナリI/O
- 日時: 2012/04/12 9:03:23
- ID: 30285
- この記事の返信元:
- (なし)
- この記事への返信:
- [30286] Re[1]: 構造体データのバイナリI/O2012/04/12 9:40:23
- ツリーを表示
BitConverter.ToString を使ってみたところ、ByteStr内の文字列の後ろに0が表示されていました。
いくつか指摘を受けて現在確認作業中ですが、以下の修正でとりあえずは望む結果が得られました。
'Stringデータの読み込み
ReDim ByteStr(32)
For loop1 As Integer = 0 To 31
ByteStr(loop1) = InpByte(dimpt + loop1)
Next
ExDt.name = System.Text.Encoding.GetEncoding(932).GetString(ByteStr)
dimpt = dimpt + 32
↓
'Stringデータの読み込み
ReDim ByteStr(32)
For loop1 As Integer = 0 To 31
If InpByte(dimpt + loop1) = 0 Then
Exit For
End If
ByteStr(loop1) = InpByte(dimpt + loop1)
Next
ReDim Preserve ByteStr(loop - 1)
ExDt.name = System.Text.Encoding.GetEncoding(932).GetString(ByteStr)
dimpt = dimpt + 32
まだまだ勉強不足なので、いろいろ試行錯誤しつつ頑張ってみます。
ありがとうございました。
分類:[.NET]
構造体(ExampleSt):変数 ExDt Public Structure ExampleSt Dim name As String Dim byte_val1 As Byte Dim byte_val2 As Byte Dim short_val As Short Dim int_val As Integer Public Sub Initialize() name = Microsoft.VisualBasic.Space(32) byte_val1 = 0 byte_val2 = 0 short_val = 0 int_val = 0 End Sub End Structure プログラムで保持している上記データをバイナリファイルとしてライト/リードしたいのですが、 Stringデータ(半角英数字と全角文字の組み合わせ)のリードがうまくいきません。 【ライト時】 Dim OutByte() As Byte Dim ByteStr() As Byte Dim dimpt As Integer Redim OutByte(40) '=32+1+1+2+4 For loop1 As Integer = 0 To 39 OutByte(loop1) = 0 Next dimpt = 0 'Stringデータの書き込み Redim ByteStr(32) ByteStr = System.Text.Encoding.GetEncoding(932).GetBytes(ExDt.name) For loop2 As Integer = 0 To System.Text.Encoding.GetEncoding(932).GetByteCount(ExDt.name) - 1 OutByte(dimpt + loop2) = ByteStr(loop2) Next dimpt = dimpt + 32 'Byteデータの書き込み OutByte(dimpt) = ExDt.byte_val1 dimpt = dimpt + 1 OutByte(dimpt) = ExDt.byte_val2 dimpt = dimpt + 1 'Shortデータの書き込み OutByte(dimpt + 1) = ExDt.short_val \ 256 OutByte(dimpt) = ExDt.short_val Mod 256 dimpt = dimpt + 2 'Integerデータの書き込み OutByte(dimpt + 3) = ExDt.int_val \ 16777216 OutByte(dimpt + 2) = (ExDt.int_val - OutByte(dimpt + 3) * 16777216) \ 65536 OutByte(dimpt + 1) = (ExDt.int_val - OutByte(dimpt + 3) * 16777216 - OutByte(dimpt + 2) * 65536) \ 256 OutByte(dimpt) = ExDt.int_val Mod 256 dimpt = dimpt + 4 File.WriteAllBytes("SaveData.bin", OutByte) 上記"SaveData.bin"をバイナリエディタで参照するとちゃんと保存できています。 nameは32文字に満たない部分は0になっています。 【リード時】 Dim InpByte() As Byte Dim ByteStr() As Byte Dim dimpt As Integer Dim ExDt As New ExampleSt Redim InpByte(40) '=32+1+1+2+4 InpByte = My.Computer.FileSystem.ReadAllBytes("SaveData.bin") ExDt.Initialize() 'Stringデータの読み込み ReDim ByteStr(32) For loop1 As Integer = 0 To 31 ByteStr(loop1) = InpByte(dimpt + loop1) Next ExDt.name = System.Text.Encoding.GetEncoding(932).GetString(ByteStr) dimpt = dimpt + 32 'Byteデータの読み込み ExDt.byte_val1 = InpByte(dimpt) dimpt = dimpt + 1 ExDt.byte_val2 = InpByte(dimpt) dimpt = dimpt + 1 'Shortデータの読み込み ExDt.short_val = InpByte(dimpt + 1) * 256 + InpByte(dimpt) dimpt = dimpt + 2 'Integerデータの読み込み ExDt.int_val = InpByte(dimpt + 3) * 16777216 + _ InpByte(dimpt + 2) * 65536 + _ InpByte(dimpt + 1) * 256 + _ InpByte(dimpt) dimpt = dimpt + 4 ExDt.nameをコントロール(TextBoxなど)に書き出すと文字列の後ろにスペースが入ってしまいます。 文字列長(.Length)も文字によってバラバラですが32に近い値になっています。 中には32を越えるものも…。 例:"よしと"→30、"けん"→31、"まさよし"→29、"Baycom"→33、"ドスパラサポートセンター"→21 どこが悪いのでしょうか?ご存知の方、お教えください。よろしくお願いします。 ShortデータやIntegerデータは上記でうまくいっているようですが、 他にいい方法があればそちらも併せてよろしくお願いします。