掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
バイナリファイルの上書き、追加、保存をするには??【.NET】 (ID:116507)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
# えぇと。πさんとπ+さんって、同一人物なのですよね? # http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200409/04090068.txt > 【【【【 MsgBox(UBound(Buffer)) 】】】】 VB独自の「UBound関数」(Microsoft.VisualBasic.Information.UBound メソッド)を 使う替わりに、標準的な「GetUpperBoundメソッド」を用いる事も出来ますね。 'MessageBox.Show(Buffer.Length.ToString()) MessageBox.Show(Buffer.GetUpperBound(0).ToString()) > 配列の大きさは10 配列の大きさは 11 では無いでしょうか? 添字の最大値が10というだけで。 蛇足ですが、下記のようなコードを使うと、下限値が 0 以外の配列を作成することが可能です。 もっとも、0以外で始まる配列を作っても、メリットはあまりありませんけれども。 Dim Buffer() As Byte Dim Ary As Array '下限値 = 3, サイズ = 10。つまり、(3〜12) な配列を作成 Ary = Array.CreateInstance(GetType(Byte), New Integer() {10}, New Integer() {3}) MessageBox.Show(String.Format("下限={0},上限={1},サイズ={2}", LBound(Ary), UBound(Ary), Ary.Length)) '下限値 = 0, サイズ = 10。つまり、(0〜9) な配列を作成 Ary = Array.CreateInstance(GetType(Byte), New Integer() {10}, New Integer() {0}) MessageBox.Show(String.Format("下限={0},上限={1},サイズ={2}", LBound(Ary), UBound(Ary), Ary.Length)) 'おまけ。VBの標準的な配列型の形式に変換。 Buffer = CType(Ary, Byte()) > Buffer = System.Text.Encoding.Default.GetBytes(Mozi) > ここで、配列が変わってしまっていると思うのですが、 配列自体を変えたくないのであれば、 System.Text.Encoding.Default.GetBytes(Mozi).CopyTo(Buffer, 0) のように書く事で、Buffer 自身は変えず、Buffer の内容だけを 変更する事が、(一応は)可能です。 ただしこの場合、事前に Buffer に十分な領域を(ReDimなどで)用意しておく 必要がありますので、その点に関しては注意するようにしてください。 もしも、Buffer に十分な領域が用意されていなかった場合には、 実行時にエラー (ArgumentException例外) が発生してしまいますから…。 ただ、個人的には、上記のような書き方はお奨めしません。 変換後の配列のサイズは、エンコーディングによって大きく左右されるため、 エンコードによっては、必要な領域を事前に判断する事が難しいからです。 # まぁ、日本語環境であれば、通常、.Default は Shift_JIS になりますけれどね。 たとえば UTF-8 などであれば、「半角英数字は、1文字あたり1バイト」 「ギリシャ語なら、1文字あたり2バイト」「漢字は、1文字あたり3バイト」などと 文字種からサイズを判定できるのですが、エンコーディングによっては、 バイト数の判定に、より複雑な計算が必要となってしまいます。 たとえば iso-2022-jp の場合、 With System.Text.Encoding.GetEncoding("iso-2022-jp") MessageBox.Show(.GetBytes("あ1い").Length.ToString()) MessageBox.Show(.GetBytes("あい1").Length.ToString()) End With 上記を実行していただくと分かりますが、同じ文字種が使われていても、 データの並び方によっては、必要なバイト数が異なってくるのです。 ではどうするかというと、一度、中間的な配列変数に WorkBuffer = System.Text.Encoding.Default.GetBytes(Mozi) のように受け取り、この WorkBuffer のサイズを判断した上で、 WorkBuffer.CopyTo(Buffer, 0) などのように書きます。これなら、サイズが不足している場合には コピー処理を中止したり、あるいはより大きな配列を使うなどする事で、 エラーの発生を回避することができるわけです。 > 変わらないようにするためにはどのようにすればいいのでしょうか 確かに、変化してしまうと困る時はありますね。 Dim DataFile As New System.IO.FileStream("c:\test.txt", IO.FileMode.Open) Dim X(0) As Byte 'この A には、X への参照を渡しています。 'これらは同じインスタンスを共有しているため、 'X の内容を書き変えると、A の内容も書き替わります。 Dim A() As Byte = X 'この B には、X の内容をコピーして渡しています。 'B と X は別のインスタンスを参照しているため、 'X の内容が変化しても、B の内容は変化しません。 Dim B() As Byte = CType(X.Clone(), Byte()) DataFile.Read(X, 0, 1) DataFile.Close() If X Is A Then MessageBox.Show("A は X と同じです。") Else MessageBox.Show("A と X とは異なります。") End If If X Is B Then MessageBox.Show("B は X と同じです。") Else MessageBox.Show("B と X とは異なります。") End If
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.