2009-01-06 285 views
2

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

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

edit--

固定长度记录被用作一个URL的参数,所以其http:\ somewebsite.com \ parseme记录=“名姓地址城市状态拉链”。我敢肯定,我不会担心ascii到unicode转换,因为它在一个url中。它比这个大一点,比地址传递更多的信息,大约30或35个字段。

回答

-2

作为答案,您应该能够使用正确大小的char数组,而无需编组。

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

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

+1

”.net中类和结构之间的差别很小,一个类可以有一个结构不能为空,否则它们的使用和功能几乎完全相同。对不起,是一个负面的南希,但这是非常错误的。 – 2015-04-21 20:29:54

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

MarshalAs用于与PInvoke(非托管代码)进行互操作。由于看起来OP在向Web发送请求之前一直处于托管代码中,因此它永远不会被编组。 “ – 2009-01-06 14:58:31

0

你可以使用VB6 COMPAT FixedLengthString类,但它是非常容易的编写自己。

如果你需要解析和验证以及所有有趣的东西,你可以看看FileHelpers,它使用属性annotate and parse fixed length records。对于任何相对较小的数据处理(例如数据处理),我可能只会使用ToFixedLength()扩展方法,在写出记录时根据需要处理填充或截断操作。对于更复杂的任何事情(如验证或解析),我会转向FileHelpers。