How to declare a fixed-length string in VB.NET?
Asked Answered
H

10

15

How do i Declare a string like this:

Dim strBuff As String * 256

in VB.NET?

Holocene answered 21/2, 2010 at 8:56 Comment(0)
K
7

Use the VBFixedString attribute. See the MSDN info here

<VBFixedString(256)>Dim strBuff As String
Karachi answered 21/2, 2010 at 9:10 Comment(2)
The annotation itself is grossly insufficient. Setting strBuff from the example above to an empty string ("") in VB6 would still yield a string with 256 spaces. This .NET equivalent does not. The annotation looks to be intended to be mostly informational and it does not enforce much about string lengths in most cases (I believe FilePut uses the information).Gynecology
See additional discussion here: #16997471Palgrave
C
7

It depends on what you intend to use the string for. If you are using it for file input and output, you might want to use a byte array to avoid encoding problems. In vb.net, A 256-character string may be more than 256 bytes.

Dim strBuff(256) as byte

You can use encoding to transfer from bytes to a string

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

You can assign 256 single-byte characters to a string if you need to use it to receive data, but the parameter passing may be different in vb.net than vb6.

s = New String(" ", 256)

Also, you can use vbFixedString. I'm not sure exactly what this does, however, because when you assign a string of different length to a variable declared this way, it becomes the new length.

<VBFixedString(6)> Public s As String
s = "1234567890" ' len(s) is now 10
Cimabue answered 21/2, 2010 at 18:56 Comment(1)
VBFixedString just instructs the VB6-compatible file read/write operations how much data to read. It doesn't affect the string object itself in any way AFAIKPalgrave
A
3

To write this VB 6 code:

Dim strBuff As String * 256

In VB.Net you can use something like:

Dim strBuff(256) As Char
Aundrea answered 21/2, 2010 at 9:17 Comment(0)
A
3

Use stringbuilder

'Declaration   
Dim S As New System.Text.StringBuilder(256, 256)
'Adding text
S.append("abc")
'Reading text
S.tostring
Aldo answered 23/4, 2013 at 11:39 Comment(0)
C
1

Try this:

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

Creates a 80 character string filled with "AAA...."'s

Here I read a 80 character string from a binary file:

    FileGet(1,strbuf)

reads 80 characters into strbuf...

Chairborne answered 23/3, 2014 at 0:3 Comment(0)
D
1

You can use Microsoft.VisualBasic.Compatibility:

Imports Microsoft.VisualBasic.Compatibility

Dim strBuff As New VB6.FixedLengthString(256)

But it's marked as obsolete and specifically not supported for 64-bit processes, so write your own that replicates the functionality, which is to truncate on setting long values and padding right with spaces for short values. It also sets an "uninitialised" value, like above, to nulls.

Sample code from LinqPad (which I can't get to allow Imports Microsoft.VisualBasic.Compatibility I think because it is marked obsolete, but I have no proof of that):

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()

which has this output:

"\0\0\0\0\0"
"Test "
"Testi"
"Test "
"Testi"

Dispassionate answered 1/11, 2014 at 4:26 Comment(0)
F
1

This object can be defined as a structure with one constructor and two properties.

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/

Foretoken answered 14/12, 2016 at 5:29 Comment(0)
J
-1

Have you tried

Dim strBuff as String

Also see Working with Strings in .NET using VB.NET

This tutorial explains how to represent strings in .NET using VB.NET and how to work with them with the help of .NET class library classes.

Jenson answered 21/2, 2010 at 8:57 Comment(2)
But there is'nt an answer thereHolocene
of course but this isn't what i need. i need him to declare it like it has been declare in vb.6Holocene
N
-1
Dim a as string

a = ...

If a.length > theLength then

     a = Mid(a, 1, theLength)

End If
Narcissus answered 14/11, 2012 at 1:54 Comment(1)
This isn't a fixed length string. What stops the string from growing in the rest of the code?Sub
S
-1

This hasn't been fully tested, but here's a class to solve this problem:

''' <summary>
''' Represents a <see cref="String" /> with a minimum
''' and maximum length.
''' </summary>
Public Class BoundedString

    Private mstrValue As String

    ''' <summary>
    ''' The contents of this <see cref="BoundedString" />
    ''' </summary>
    Public Property Value() As String
        Get
            Return mstrValue
        End Get

        Set(value As String)
            If value.Length < MinLength Then
                Throw New ArgumentException(String.Format("Provided string {0} of length {1} contains less " &
                                                          "characters than the minimum allowed length {2}.",
                                                          value, value.Length, MinLength))
            End If

            If value.Length > MaxLength Then
                Throw New ArgumentException(String.Format("Provided string {0} of length {1} contains more " &
                                                          "characters than the maximum allowed length {2}.",
                                                          value, value.Length, MaxLength))
            End If

            If Not AllowNull AndAlso value Is Nothing Then
                Throw New ArgumentNullException(String.Format("Provided string {0} is null, and null values " &
                                                              "are not allowed.", value))
            End If

            mstrValue = value
        End Set
    End Property

    Private mintMinLength As Integer
    ''' <summary>
    ''' The minimum number of characters in this <see cref="BoundedString" />.
    ''' </summary>
    Public Property MinLength() As Integer
        Get
            Return mintMinLength
        End Get

        Private Set(value As Integer)
            mintMinLength = value
        End Set

    End Property

    Private mintMaxLength As Integer
    ''' <summary>
    ''' The maximum number of characters in this <see cref="BoundedString" />.
    ''' </summary>
    Public Property MaxLength As Integer
        Get
            Return mintMaxLength
        End Get

        Private Set(value As Integer)
            mintMaxLength = value
        End Set
    End Property

    Private mblnAllowNull As Boolean
    ''' <summary>
    ''' Whether or not this <see cref="BoundedString" /> can represent a null value.
    ''' </summary>
    Public Property AllowNull As Boolean
        Get
            Return mblnAllowNull
        End Get

        Private Set(value As Boolean)
            mblnAllowNull = value
        End Set
    End Property

    Public Sub New(ByVal strValue As String,
                   ByVal intMaxLength As Integer)
        MinLength = 0
        MaxLength = intMaxLength
        AllowNull = False

        Value = strValue
    End Sub

    Public Sub New(ByVal strValue As String,
                   ByVal intMinLength As Integer,
                   ByVal intMaxLength As Integer)
        MinLength = intMinLength
        MaxLength = intMaxLength
        AllowNull = False

        Value = strValue
    End Sub

    Public Sub New(ByVal strValue As String,
                   ByVal intMinLength As Integer,
                   ByVal intMaxLength As Integer,
                   ByVal blnAllowNull As Boolean)
        MinLength = intMinLength
        MaxLength = intMaxLength
        AllowNull = blnAllowNull

        Value = strValue
    End Sub
End Class
Steenbok answered 12/2, 2015 at 21:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.