取得したコンピュータ名からNullを削除する
投稿者 なす  (社会人)
投稿日時
2021/10/18 10:39:24
おはようございます。VB.NETの質問です。NameBufferへコンピュータ名を16文字長で取得しました。NameBufferは「**** 」と、コンピュータ名****の後16文字目までNullCharが入っています。この文字列のコンピュータ名以降のNullCharを取り除きたいのですが、以下のコードを実行するとPcNameの部分で「Lengthは0またはそれ以上の値が必要です」と例外エラーが発生します。どういう処理が必要でしょうか?
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2021/10/18 10:56:52
> 16文字目までNullCharが入っています。
いえ、入らないと思いますよ?
提示されたコードで後続に LSet される文字は、ChrW(0) ではなく ChrW(32) ですよね?
そして ChrW(32) を取り除くだけなら、
PcName = NameBuffer.TrimEnd(" "c)
あるいは
PcName = NameBuffer.TrimEnd()
あるいは
PcName = RTrim(NameBuffer)
で十分のはずです。
また、もしも本当に NullChar で 16 桁にパディングしたいのであれば、LSet ではなく
NameBuffer = Environment.MachineName.PadRight(16, vbNullChar(0))
などとすべきですし、その NullChar を取り除く処理は
PcName = NameBuffer.TrimEnd(vbNullChar.ToCharArray())
と書けます。
いえ、入らないと思いますよ?
提示されたコードで後続に LSet される文字は、ChrW(0) ではなく ChrW(32) ですよね?
そして ChrW(32) を取り除くだけなら、
PcName = NameBuffer.TrimEnd(" "c)
あるいは
PcName = NameBuffer.TrimEnd()
あるいは
PcName = RTrim(NameBuffer)
で十分のはずです。
また、もしも本当に NullChar で 16 桁にパディングしたいのであれば、LSet ではなく
NameBuffer = Environment.MachineName.PadRight(16, vbNullChar(0))
などとすべきですし、その NullChar を取り除く処理は
PcName = NameBuffer.TrimEnd(vbNullChar.ToCharArray())
と書けます。
投稿者 るきお  (社会人)
投稿日時
2021/10/18 10:57:05
そのあたりの処理はEnvironmentクラスがうまくやってくれるので、マシン名を取得するにはただ単に次のように記述すつだけです。
.NET以前はこのような便利なクラスがなかったので、Windows APIを呼び出して、バッファに敷き詰められたNull文字列を自分で除去する必要がありましたね。もう20年くらい前の話です。
https://www.umayadia.com/main/Samples/vbsample010.htm
なお、LSetであまったところに埋められるのはvbNullCharではなく、半角スペースのようです。だから、InStr(NameBuffer, vbNullChar) が 0 を返してプログラムがStrings.Leftでエラーになってしまっているようですね。
なお、今回 LSet を使用されている目的がわかりませんでしたが、16文字に切り詰めるために LSet を使う人はかなり少数派で、SubString が主流です。16文字以下の場合、右側にスペースを埋めるには PadRight を使用します。
参考(今回やりたいこととは違うと思いますが、例として挙げます)
Dim PcName As String
PcName = Environment.MachineName
.NET以前はこのような便利なクラスがなかったので、Windows APIを呼び出して、バッファに敷き詰められたNull文字列を自分で除去する必要がありましたね。もう20年くらい前の話です。
https://www.umayadia.com/main/Samples/vbsample010.htm
なお、LSetであまったところに埋められるのはvbNullCharではなく、半角スペースのようです。だから、InStr(NameBuffer, vbNullChar) が 0 を返してプログラムがStrings.Leftでエラーになってしまっているようですね。
なお、今回 LSet を使用されている目的がわかりませんでしたが、16文字に切り詰めるために LSet を使う人はかなり少数派で、SubString が主流です。16文字以下の場合、右側にスペースを埋めるには PadRight を使用します。
参考(今回やりたいこととは違うと思いますが、例として挙げます)
'PcNameが16文字以下の場合、16文字になるように右側にスペースを埋め、16文字以上の場合は、左から16文字までで切り捨てる。
PcName = PcName.PadRight(16).Substring(0, 16)
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2021/10/18 11:00:34
訂正。
String 型としての NullChar ではなく Char 型としての NullChar を扱うのであれば、
vbNullChar ではなく ControlChars.NullChar を使うべきでした。
String 型としての NullChar ではなく Char 型としての NullChar を扱うのであれば、
vbNullChar ではなく ControlChars.NullChar を使うべきでした。
NameBuffer = Environment.MachineName.PadRight(16, ControlChars.NullChar)
PcName = NameBuffer.TrimEnd(ControlChars.NullChar)
投稿者 なす  (社会人)
投稿日時
2021/10/18 20:50:49
魔界の仮面弁士様、るきお様
とても参考になりました!ありがとうございました!
とても参考になりました!ありがとうございました!