C#中固定长度的字符串或结构

时间:2009-01-06 02:23:09

标签: c# .net vb.net

我需要为我正在处理的项目创建一个固定长度的结构或一系列字符串。目前它是用COBOL编写的,是一种通信应用程序。它通过网络发送固定长度的记录,并收回固定长度的记录。我想把它写成一个简单的结构,但到目前为止,我发现的最好的方法是使用string.padright将字符串终止符放在正确的位置。

我可以编写一个封装了这个并返回固定长度字符串的类,但我希望找到一种简单的方法来填充结构并将其用作固定长度的记录。

编辑 -

固定长度记录用作URL中的参数,因此其http:\ somewebsite.com \ parseme?record =“firstname lastname address city state zip”。我很确定我不必担心ascii转换为unicode,因为它在url中。它比这大一点,传递的信息多于地址,大约30或35个字段。

3 个答案:

答案 0 :(得分:4)

将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 :(得分:1)

您可以使用VB6 compat FixedLengthString类,但编写自己的类非常简单。

如果您需要解析和验证以及所有有趣的内容,您可能需要查看使用属性FileHelpersannotate and parse fixed length records

FWIW,对于任何相对简单的事情(例如数据处理)我可能只是使用ToFixedLength()扩展方法,在写出记录时根据需要处理填充或截断。对于任何更复杂的事情(如验证或解析),我将转向FileHelpers。

答案 2 :(得分:-2)

作为答案,你应该能够使用正确大小的字符数组,而不必编组。

此外,.net中的类和结构之间的差异很小。类可以,结构不能为null。否则它们的使用和功能几乎完全相同。

最后,听起来你应该留意正在发送的字符的大小。我假设(我知道,我知道)COBOL使用8位ASCII字符,而.net字符串将使用UTF-16编码字符集。这意味着COBOL中的10个字符的字符串是10个字节,但在.net中,相同的字符串是20个字节。