- PR -

VB.NETでEncoding.ASCIIした文字をシリアル化するとエラーになる

投稿者投稿内容
MASAI
会議室デビュー日: 2005/01/18
投稿数: 6
投稿日時: 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&#x0;</MKname>
−−−−−−−−−−−−−−−−−−−−−−−−
PicRW.MKname = "SONY"
というコーディングでシリアル化し、XMLファイルをメモ帳で読むと下記とおりでした。
−−−−−−−−−−−−−−−−−−−−−−−−
<MKname>SONY</MKname>
−−−−−−−−−−−−−−−−−−−−−−−−

やっぱりエンコードがいけないのでしょうか?
いろいろとヒント頂きありがとうございます。
宜しくお願いします。


にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-20 11:51
最後に NUL が付いているみたいですね。
もしかして、PI1.Len = 4 とかになっていませんか?
もしそうだとすると、PI1.Value をとる際に先頭の Len バイトだけを抜き出さないといけないのかもしれない。

もしくは Exif の規格で NUL をつけるようになっているとか。

[ メッセージ編集済み 編集者: にしざき 編集日時 2005-01-20 11:52 ]
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-20 11:57
と思って規格を見てみたら、やはり文字列属性は NUL をつけていると書いてありましたね。
引用:
2 = ASCII An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.,


となると、明示的に最後の NUL をとってから処理する必要がありますね。
MASAI
会議室デビュー日: 2005/01/18
投稿数: 6
投稿日時: 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
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
対処方法としてきれいかどうかは別として上記方法で対処できました。
皆さん本当にありがとうございます。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-21 08:48
たぶん、PI1.Len は元のバッファにおける長さなので、AsciiString ではなく PI1.Value に適用したほうがいいと思います。
で、おそらく単純に
コード:
Encoding.ASCII.GetString(PI1.Value, 0, PI1.Len - 1)

でいいんじゃないかという気がするんですが、試していないのでわかりません。
MASAI
会議室デビュー日: 2005/01/18
投稿数: 6
投稿日時: 2005-01-21 13:17
教えて頂いたコードで試してみました。
コード:----------------------------------------------------------------
Encoding.ASCII.GetString(PI1.Value, 0, PI1.Len - 1)
------------------------------------------------------------------------
問題ありませんでした。
このコードで進めたいと思います。ありがとうございます。

今回いろいろとアドバイスを頂いた方々に深く感謝致します。
本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)