ページ 11

NULLを含む文字列

Posted: 2006年7月25日(火) 15:51
by 超初心者
Dim ab As String
ab = Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0)

上記と同じ事を、Byte配列で行いたいのですが、

Dim ab[3] As Byte
lstrcpy(ab As BytePtr,Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0))

としても、NULLが入りません。
どうすれば良いのでしょう?

Re: NULLを含む文字列

Posted: 2006年7月25日(火) 16:45
by NoWest
> Dim ab As String
> ab = Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0)
>
> 上記と同じ事を、Byte配列で行いたいのですが、
>
> Dim ab[3] As Byte
> lstrcpy(ab As BytePtr,Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0))
>
> としても、NULLが入りません。
> どうすれば良いのでしょう?

さてさて、どうしてlstrcpyを使用したときにうまくいかないと思いますか?

この問いの答えは簡単で、lstrcpy関数はコピーしようとする文字列にNULL文字が含まれている場合、その場でコピーを止めてしまうんですね。

これをどうやって回避するかといいますとコピーしようとする文字の長さを予め指定してコピーしてやればよいということになります。

とはいっても、lstrcpy関数には文字の長さを指定することが出来ませんのでメモリ関連の操作にしようするmemcpy関数を変わりに使ってやります。

コード: 全て選択

Dim ab[3] As Byte
Dim str As String
str=Chr$(&H31)+Chr$(0)+Chr$(&H32)+Chr$(0)
memcpy(ab As BytePtr,StrPtr(str),4)

Posted: 2006年7月25日(火) 17:44
by イグトランス
もっと短くmemcpy(ab, Ex"1\02\0", 4)やmemcpy(ab, Ex"1\02", 4)とも書けます。
Ex付きの文字列では\0がChr$(0)相当に扱われます。

さらに,これ以降abの中身を書き換えることが無ければ,abをBytePtr型にして,こうにも書けます。

コード: 全て選択

Dim ab As BytePtr
ab = Ex"1\02"