2009-01-06 282 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。