- - PR -
VB.NETでEncoding.ASCIIした文字をシリアル化するとエラーになる
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-01-20 11:14
いろいろと対応していただきありがとうございます。
いろいろとご質問頂いてますので順番に記述致します。 xmlファイルの読み出しについては、プログラムで読み出しています。 −−−−−−−− CD内容 −−−−−−−− Dim serializer2 As New System.Xml.Serialization.XmlSerializer(GetType(PicClass)) Dim fs2 As New IO.FileStream(FileName, IO.FileMode.Open) PicRW = CType(serializer2.Deserialize(fs2), PicClass) fs2.Close() −−−−−−−−−−−−−−−−−−−−−− 上記2行目でエラーになります。 「"SONY」取得場所でエンコードせずに「"SONY"」と直接書くとOKです。 というのは、 PicRW.MKname = "SONY" とコーディングしました。 Exif内のデータ(PI1.Value)について、デバッガで見てみました。 length=5で内容は、「83,79,78,89,00」でした。 次にエンコードをシングルステップで実行すると デバッガ上赤字で「"SONY」と表示されます。 また、XMLファイルをメモ帳で読むと下記とおりでした。 −−−−−−−−−−−−−−−−−−−−−−−− <MKname>SONY�</MKname> −−−−−−−−−−−−−−−−−−−−−−−− PicRW.MKname = "SONY" というコーディングでシリアル化し、XMLファイルをメモ帳で読むと下記とおりでした。 −−−−−−−−−−−−−−−−−−−−−−−− <MKname>SONY</MKname> −−−−−−−−−−−−−−−−−−−−−−−− やっぱりエンコードがいけないのでしょうか? いろいろとヒント頂きありがとうございます。 宜しくお願いします。 | ||||
|
投稿日時: 2005-01-20 11:51
最後に NUL が付いているみたいですね。
もしかして、PI1.Len = 4 とかになっていませんか? もしそうだとすると、PI1.Value をとる際に先頭の Len バイトだけを抜き出さないといけないのかもしれない。 もしくは Exif の規格で NUL をつけるようになっているとか。 [ メッセージ編集済み 編集者: にしざき 編集日時 2005-01-20 11:52 ] | ||||
|
投稿日時: 2005-01-20 11:57
と思って規格を見てみたら、やはり文字列属性は NUL をつけていると書いてありましたね。
となると、明示的に最後の NUL をとってから処理する必要がありますね。 | ||||
|
投稿日時: 2005-01-20 21:03
正常にシリアル化できるようになりました。
いろいろありがとうございます。 やり方は、下記の様にしました。 −−−−−−−−−−−−−−− CD −−−−−−−−−−−−−−− Dim AsciiString() As Char 'ASCII文字列の入力エリア Dim AsciiStringLen As Integer 'ASCII文字列の長さ Dim i As Integer 'ASCII文字列コピーカウンタ 'メーカー名 Dim MKnameIdx As Integer = Array.IndexOf(PrptyIDList, &H10F) If MKnameIdx >= 0 Then PI1 = PicBitmap.PropertyItems(MKnameIdx) AsciiString = Encoding.ASCII.GetString(PI1.Value) 'キャラ配列に読み込む AsciiStringLen = PI1.Len 'レングスGET i = 0 Do While (AsciiStringLen - 1) > i '最後のNULLカットしてMKnameへ挿入。 PicRW.MKname += AsciiString(i) i = i + 1 Loop End If −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 対処方法としてきれいかどうかは別として上記方法で対処できました。 皆さん本当にありがとうございます。 | ||||
|
投稿日時: 2005-01-21 08:48
たぶん、PI1.Len は元のバッファにおける長さなので、AsciiString ではなく PI1.Value に適用したほうがいいと思います。
で、おそらく単純に
| ||||
|
投稿日時: 2005-01-21 13:17
教えて頂いたコードで試してみました。
コード:---------------------------------------------------------------- Encoding.ASCII.GetString(PI1.Value, 0, PI1.Len - 1) ------------------------------------------------------------------------ 問題ありませんでした。 このコードで進めたいと思います。ありがとうございます。 今回いろいろとアドバイスを頂いた方々に深く感謝致します。 本当にありがとうございました。 |