web-dev-qa-db-ja.com

VB.NETで固定長文字列を宣言する方法は?

次のように文字列を宣言する方法:

Dim strBuff As String * 256

vB.NETで?

13
Rachel

VBFixedString属性を使用します。 MSDN情報を参照 ここ

<VBFixedString(256)>Dim strBuff As String
7
Spencer Ruport

文字列を何に使用するかによって異なります。ファイルの入出力に使用している場合は、エンコードの問題を回避するためにバイト配列を使用できます。 vb.netでは、256文字の文字列は256バイトを超える場合があります。

Dim strBuff(256) as byte

エンコーディングを使用してバイトから文字列に転送できます

Dim s As String
Dim b(256) As Byte
Dim enc As New System.Text.UTF8Encoding
...
s = enc.GetString(b)

文字列を使用してデータを受信する必要がある場合は、256の半角文字を文字列に割り当てることができますが、vb.netとvb6では、渡されるパラメーターが異なる場合があります。

s = New String(" ", 256)

また、vbFixedStringを使用できます。ただし、これが何をするのか正確にはわかりません。この方法で宣言された変数に異なる長さの文字列を割り当てると、それが新しい長さになるためです。

<VBFixedString(6)> Public s As String
s = "1234567890" ' len(s) is now 10
6
xpda

これを書くにはVB 6コード:

Dim strBuff As String * 256

VB.Netでは、次のようなものを使用できます。

Dim strBuff(256) As Char
3
Dr.Optix

文字列ビルダーを使用

'Declaration   
Dim S As New System.Text.StringBuilder(256, 256)
'Adding text
S.append("abc")
'Reading text
S.tostring
3
Prince Waleed

このオブジェクトは、1つのコンストラクターと2つのプロパティを持つ構造体として定義できます。

Public Structure FixedLengthString
     Dim mValue As String
     Dim mSize As Short

     Public Sub New(Size As Integer)
         mSize = Size
         mValue = New String(" ", mSize)
     End Sub

     Public Property Value As String
         Get
             Value = mValue
         End Get

         Set(value As String)
             If value.Length < mSize Then
                 mValue = value & New String(" ", mSize - value.Length)
             Else
                 mValue = value.Substring(0, mSize)
             End If
         End Set
     End Property
 End Structure

https://jdiazo.wordpress.com/2012/01/12/getting-rid-of-vb6-compatibility-references/

1
Kanad Mehta

Microsoft.VisualBasic.Compatibilityを使用できます。

Imports Microsoft.VisualBasic.Compatibility

Dim strBuff As New VB6.FixedLengthString(256)

しかし、それは 廃止され、64ビットプロセスでは特にサポートされていません としてマークされているため、機能を複製する独自のコードを記述します。また、上記のように「初期化されていない」値をnullに設定します。

LinqPadからのサンプルコード(これはImports Microsoft.VisualBasic.Compatibilityを許可することはできませんが、廃止されたとマークされているためだと思いますが、それを証明するものはありません):

Imports Microsoft.VisualBasic.Compatibility

Dim U As New VB6.FixedLengthString(5)
Dim S As New VB6.FixedLengthString(5, "Test")
Dim L As New VB6.FixedLengthString(5, "Testing")
Dim p0 As Func(Of String, String) = Function(st) """" & st.Replace(ChrW(0), "\0") & """"
p0(U.Value).Dump()
p0(S.Value).Dump()
p0(L.Value).Dump()
U.Value = "Test"
p0(U.Value).Dump()
U.Value = "Testing"
p0(U.Value).Dump()

これはこの出力を持っています:

「\ 0\0\0\0\0」
「テスト」
「テスティ」
「テスト」
「テスティ」

1
Mark Hurd

これを試して:

    Dim strbuf As New String("A", 80)

「AAA ....」で満たされた80文字の文字列を作成します

ここでは、バイナリファイルから80文字の文字列を読み取ります。

    FileGet(1,strbuf)

80文字をstrbufに読み込みます...

1
Gawie