Строки или структуры фиксированной длины в C # - PullRequest
2 голосов
/ 06 января 2009

Мне нужно создать структуру или серию строк с фиксированной длиной для проекта, над которым я работаю. В настоящее время он написан на языке COBOL и является приложением для общения. Он отправляет запись фиксированной длины через Интернет и получает обратно запись фиксированной длины. Я хотел бы написать его как структуру для простоты, но на данный момент лучшее, что я нашел, это метод, который использует string.padright, чтобы поместить терминатор строки в правильное место.

Я мог бы написать класс, который инкапсулирует это и возвращает строку фиксированной длины, но я надеюсь найти простой способ заполнить структуру и использовать ее как запись фиксированной длины.

редактировать -

Запись фиксированной длины используется в качестве параметра в URL, поэтому ее http: \ somewebsite.com \ parseme? Record = "имя, фамилия, адрес, город, штат, почтовый индекс". Я почти уверен, что мне не придется беспокоиться о преобразованиях ASCII в Unicode, так как это в URL. Это немного больше, и передается больше информации, чем адрес, около 30 или 35 полей.

Ответы [ 3 ]

4 голосов
/ 06 января 2009

Добавьте тег MarshalAs в свою структуру. Вот пример:

<StructLayout (LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Structure OSVERSIONINFO
    Public dwOSVersionInfoSize As Integer
    Public dwMajorVersion As Integer
    Public dwMinorVersion As Integer
    Public dwBuildNumber As Integer
    Public dwPlatformId As Integer

    <MarshalAs (UnmanagedType.ByValTStr, SizeConst:=128)> _
    Public szCSDVersion As String
End Structure

http://bytes.com/groups/net-vb/369711-defined-fixed-length-string-structure

1 голос
/ 06 января 2009

Вы можете использовать класс VB6 FixedLengthString , но написать свой собственный довольно просто.

Если вам нужен анализ, проверка и все эти забавные вещи, вы можете взглянуть на FileHelpers , который использует атрибуты для аннотирования и анализа записей фиксированной длины .

FWIW, относительно чего-либо относительно тривиального (например, обработка данных), я бы, вероятно, просто использовал метод расширения ToFixedLength (), который по мере необходимости заботился о дополнении или усечении при записи записей. Для чего-то более сложного (например, проверки или анализа) я бы обратился к FileHelpers.

0 голосов
/ 06 января 2009

В ответ вы должны иметь возможность использовать массивы символов правильного размера, без необходимости маршалировать.

Кроме того, разница между классом и структурой в .net минимальна. Структура не может быть нулевой, в то время как класс может. В остальном их использование и возможности практически идентичны.

Наконец, звучит так, как будто вы должны помнить о размере отправляемых символов. Я предполагаю (я знаю, я знаю), что COBOL использует 8-битные символы ASCII, в то время как строки .net будут использовать набор символов в кодировке UTF-16. Это означает, что 10-символьная строка в COBOL составляет 10 байт, но в .net эта же строка составляет 20 байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...