C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

バイナリファイルへの書込み


(過去ログ 7 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■7241 / inTopicNo.1)  バイナリファイルへの書込み
  
□投稿者/ pSy-Colo 二等兵(1回)-(2006/10/05(Thu) 11:31:53)

分類:[C#] 


分類:[C#] 

環境:OS:XP
   言語:C#(VS2003)
ハジメマシテ。少し分からない点がありましたのでどなたかご教授願えないでしょうか?

ただ今VB6.0で作られたプログラムをC#で作成しているのですが、
バイナリファイルの書込み部分でどのようにC#では書いたら良いか分からず止まっております。
[バイナリファイル書込み部分]-VB6.0
Public Function SqcNoPut(No As String) As Currency

'シーケンスNOをファイルにセット

Dim N As String * 6
Dim L As Long
Dim Path As String

Path = O_CNT_SEQ_F
N = No

On Error Resume Next

L = FileLen(Path)

If Err <> 0 Or L = 0 Then

SqcNoPut = 1
Exit Function
Else
Open Path For Binary Access Write As #1
End If

Put #1, 3, N
Close #1

SqcNoPut = 0

End Function

の部分なのですが、これをC#で調べた限りで書きかえてみた(下記参照)のですがバイナリデータとして書き込まれません。
[C#で書き換えてみたソース]-C#
public static void write_bin_file(string BinFileName,string BinData)
{

BinaryWriter binWriter = new BinaryWriter(new FileStream(BinFileName, FileMode.CreateNew));
try
{
byte[] bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(BinData);

binWriter.Write(bytesData,0,bytesData.Length );
}
catch
{
}
finally
{
binWriter.Close();
}

}
とあるアプリケーションで、シーケンス番号を保持するのに使っておりまして、C#のソースで作られたファイルは不正と弾かれてしまいます。
どなたかお分かりになる方が見えましたらご教授願えないでしょうか??




0
引用返信 編集キー/
■7246 / inTopicNo.2)  Re[1]: バイナリファイルへの書込み
□投稿者/ 魔界の仮面弁士 大尉(171回)-(2006/10/05(Thu) 12:12:51)

分類:[C#] 

> Dim N As String * 6
> N = No
> Open Path For Binary Access Write As #1
> Put #1, 3, N
> Close #1

厄介なのは、固定長文字列型変数 N ですね。

VB6 のそれは、バイナリモードで出力された場合でも、Unicode→Shift_JIS変換を
発生させるようになっていたと思います。ですから、元となる引数 No の内容に
漢字等があるかどうかで、その出力サイズが「6バイト〜12バイト」の範囲で
変動するはずです。


> BinaryWriter binWriter = new BinaryWriter(new FileStream(BinFileName, FileMode.CreateNew));

元の VB6 コードを読んでみると、「ファイルサイズが0なら何もしない」
「0バイトを超えるサイズなら、3バイト目に書き込む(先頭2バイトはそのまま)」
という処理が行われていますから、ここで CreateNew を使うべきではないかと。


> byte[] bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(BinData);
Shift_JIS にエンコードする前に、VB6でいうところの

> Dim N As String * 6
> N = No
に相当する処理が必要になりますから、.GetBytes(BinData) ではなく、
.GetBytes((BinData + " ").Substring(0, 6)) などの方が良いかと。


> binWriter.Write(bytesData,0,bytesData.Length );
これだと、
> Put #1, 3, N
ではなく、
> Put #1, , N
という意味になってしまいます。「3バイト目」に書き込むのですから、
事前に、.Seek(2, Begin)などが必要になるかと思います。

0
引用返信 編集キー/
■7254 / inTopicNo.3)  Re[2]: バイナリファイルへの書込み
□投稿者/ pSy-Colo 二等兵(2回)-(2006/10/05(Thu) 13:21:54)

分類:[C#] 

分かりやすい解説ですぐに解決しました!!!ありがとうございます。
もともとそんなに難しい事ではなかったんでしょうか....orz
少し質問がありますので後学のためお答え頂けたらと思います。

>厄介なのは、固定長文字列型変数 N ですね。
>VB6 のそれは、バイナリモードで出力された場合でも、Unicode→Shift_JIS変換を
>発生させるようになっていたと思います。ですから、元となる引数 No の内容に
>漢字等があるかどうかで、その出力サイズが「6バイト〜12バイト」の範囲で
>変動するはずです。

Noに入る値は"000001"〜"999999"の間で数字のみと決められてるので大丈夫だと思います!!

>元の VB6 コードを読んでみると、「ファイルサイズが0なら何もしない」
>「0バイトを超えるサイズなら、3バイト目に書き込む(先頭2バイトはそのまま)」
>という処理が行われていますから、ここで CreateNew を使うべきではないかと。
Openモードにしてみましたところうまく行きました☆

> byte[] bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(BinData);
Shift_JIS にエンコードする前に、VB6でいうところの

> Dim N As String * 6
> N = No
>に相当する処理が必要になりますから、.GetBytes(BinData) ではなく、
>.GetBytes((BinData + " ").Substring(0, 6)) などの方が良いかと。
すいません。知識が足らず申し訳ないんですが、BinDataに" "を追加して
"000001 "になってからSubStringで1文字目から6文字目,ゆえに"000001"を取得する事に
なると思うんですけど,これは固定長文字列の長さが6になっているので、
6文字を正確に取得するために行う作業ですか????

>という意味になってしまいます。「3バイト目」に書き込むのですから、
>事前に、.Seek(2, Begin)などが必要になるかと思います。

事前に.Seek(2, Begin)お行う事で、バイナリファイルの書込み位置が,3バイト目から行われる
。ゆえに読込位置を指定できるという事ですか??

よろしくお願い致します。

0
引用返信 編集キー/
■7255 / inTopicNo.4)  Re[3]: バイナリファイルへの書込み
□投稿者/ 魔界の仮面弁士 大尉(172回)-(2006/10/05(Thu) 14:53:28)

分類:[C#] 

>> .GetBytes((BinData + " ").Substring(0, 6)) などの方が良いかと。
> 6文字を正確に取得するために行う作業ですか????
そうです。6文字未満なら空白補助、多すぎればカットするためのものです。

掲示板投稿時に「図表モード」ではなく、「通常モード」のままになっていたので
空白が潰れてしまっていますが(うっかりしていていました…)、先のコードは、
 (BinData + " ").Substring(0, 6)
ではなく、実際には
 (BinData + " ").Substring(0, 6)
と書かれています。連結するのは空白6個なので、注意してください。


> 。ゆえに読込位置を指定できるという事ですか??
読込位置ではなく、書込位置ですね。
なにしろ、"BinaryWriter" クラスですから。


0
引用返信 編集キー/
■7259 / inTopicNo.5)  Re[4]: バイナリファイルへの書込み
□投稿者/ pSy-Colo 二等兵(3回)-(2006/10/05(Thu) 15:29:29)

分類:[C#] 

ありがとうございました!!
ご丁寧な説明で本当分かりやすかったです!!
またお世話になるかもしれませんがよろしくお願い致します!!
本当にありがとうございました!!

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -