1

以下に更新

VB.NET で BinaryReader を使用してバイナリ ファイルを読み込んでいます。ファイル内の各行の構造は次のとおりです。

    "Category" = 1 byte
    "Code" = 1 byte
    "Text" = 60 Bytes

    Dim Category As Byte
    Dim Code As Byte
    Dim byText() As Byte
    Dim chText() As Char
    Dim br As New BinaryReader(fs)

    Category = br.ReadByte()
    Code = br.ReadByte()
    byText = br.ReadBytes(60)
    chText = encASCII.GetChars(byText)

問題は、「テキスト」フィールドにパディングに使用されるいくつかのファンキーな文字があることです。ほとんどが 0x00 ヌル文字のようです。

  1. エンコーディングによってこれらの 0x00 文字を取り除く方法はありますか?

  2. それ以外の場合、chText 配列を置換して 0x00 文字を取り除くにはどうすればよいですか? 結果のデータテーブルを XML にシリアル化しようとしていますが、これらの非準拠文字で失敗しています。配列をループすることはできますが、置換の方法がわかりません。

アップデート:

これは、以下の男性/ギャルからの多くの助けを借りて私がいる場所です. 最初のソリューションは機能しますが、期待したほど柔軟ではありません。2 番目のソリューションは 1 つのユース ケースで失敗しますが、はるかに一般的です。

広告 1) このサブルーチンに文字列を渡すことで問題を解決できます

    Public Function StripBad(ByVal InString As String) As String
        Dim str As String = InString
        Dim sb As New System.Text.StringBuilder
        strNew = strNew.Replace(chBad, " ")
        For Each ch As Char In str

            If StrComp(ChrW(Val("&H25")), ch) >= 0 Then
                ch = " "
            End If
            sb.Append(ch)
        Next

        Return sb.ToString()
    End Function

広告 2) このルーチンはいくつかの問題のある文字を取り除きますが、0x00 では失敗します。これは、MSDN http://msdn.microsoft.com/en-us/library/kdcak6ye.aspxから改作されました。

    Public Function StripBadwithConvert(ByVal InString As String) As String
        Dim unicodeString As String
        unicodeString = InString
        ' Create two different encodings.
        Dim ascii As Encoding = Encoding.ASCII
        Dim [unicode] As Encoding = Encoding.UTF8

        ' Convert the string into a byte[].
        Dim unicodeBytes As Byte() = [unicode].GetBytes(unicodeString)

        Dim asciiBytes As Byte() = Encoding.Convert([unicode], ascii, unicodeBytes)

        Dim asciiChars(ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length) - 1) As Char
        ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0)
        Dim asciiString As New String(asciiChars)

        Return asciiString
    End Function
4

3 に答える 3

0

構造体を使用してデータをロードできます。

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)]
internal struct TextFileRecord
{
    [System.Runtime.InteropServices.FieldOffset(0)]
    public byte Category;
    [System.Runtime.InteropServices.FieldOffset( 1 )]
    public byte Code;
    [System.Runtime.InteropServices.FieldOffset( 2 )]
    [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr, SizeConst=60)]
    public string Text;
}

文字列エンコーディングに合わせて UnmanagedType-Argument を調整する必要があります。

于 2009-08-30T09:59:14.467 に答える
0

ヌル文字がテキストの右側のパディング (つまり、終了) として使用されている場合 (これは通常のケースです)、これはかなり簡単です:

Dim strText As String = encASCII.GetString(byText)
Dim strlen As Integer = strText.IndexOf(Chr(0))
If strlen <> -1 Then
    strText = strText.Substr(0, strlen - 1)
End If

そうでない場合でもReplace、文字列に対して法線を実行できます。文字列に変換するに、バイト配列でプルーニングを行うと、少し「きれい」になります。ただし、原則は同じままです。

Dim strlen As Integer = Array.IndexOf(byText, 0)
If strlen = -1 Then
    strlen = byText.Length + 1
End If
Dim strText = encASCII.GetString(byText, 0, strlen - 1)
于 2009-08-30T07:32:31.610 に答える