Как объявить строку фиксированной длины в VB.NET? - PullRequest
13 голосов
/ 21 февраля 2010

Как мне объявить строку, подобную этой:

Dim strBuff As String * 256

в VB.NET?

Ответы [ 10 ]

6 голосов
/ 21 февраля 2010

Это зависит от того, для чего вы собираетесь использовать строку. Если вы используете его для ввода и вывода файлов, вы можете использовать байтовый массив, чтобы избежать проблем с кодированием. В 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 голосов
/ 21 февраля 2010

Используйте атрибут VBFixedString. См. Информацию MSDN здесь

<VBFixedString(256)>Dim strBuff As String
3 голосов
/ 23 апреля 2013

Использование stringbuilder

'Declaration   
Dim S As New System.Text.StringBuilder(256, 256)
'Adding text
S.append("abc")
'Reading text
S.tostring
3 голосов
/ 21 февраля 2010

Написать код VB 6:

Dim strBuff As String * 256

В VB.Net вы можете использовать что-то вроде:

Dim strBuff(256) As Char
1 голос
/ 14 декабря 2016

Этот объект может быть определен как структура с одним конструктором и двумя свойствами.

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 голос
/ 01 ноября 2014

Вы можете использовать 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"
«Тест»
"Тести"
«Тест»
"Тести"

0 голосов
/ 13 февраля 2015

Это не было полностью протестировано, но вот класс для решения этой проблемы:

''' <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
0 голосов
/ 23 марта 2014

Попробуйте это:

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

Создает строку из 80 символов, заполненную символом "AAA ...."

Здесь я читаю 80-символьную строку из двоичного файла:

    FileGet(1,strbuf)

читает 80 символов в strbuf ...

0 голосов
/ 14 ноября 2012
Dim a as string

a = ...

If a.length > theLength then

     a = Mid(a, 1, theLength)

End If
0 голосов
/ 21 февраля 2010

Вы пробовали

Dim strBuff as String

Также см. Работа со строками в .NET с использованием VB.NET

В этом уроке объясняется, как представлять строки в .NET с использованием VB.NET и как работать с ними с помощь классов библиотеки классов .NET.

...