Question

DESSOUS MISE À JOUR

Je suis en train de lire un fichier binaire en utilisant BinaryReader en VB.NET. La structure de chaque ligne du fichier est le suivant:

    "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)

Le problème est que le champ « texte » a des caractères funky utilisés pour le rembourrage. La plupart du temps semble être 0x00 caractères nuls.

  1. Y at-il moyen de se débarrasser de ces caractères 0x00 par un encodage?

  2. Sinon, comment puis-je faire un remplacement sur le tableau chText pour se débarrasser des caractères 0x00? Je suis en train de sérialisation datatable résultant XML et il échoue sur ces caractères non conformes. Je suis en mesure de boucle à travers le réseau, mais je ne peux pas comprendre comment faire le remplacer?

Mise à jour:

est où je suis à avec beaucoup d'aide de gars / filles ci-dessous. Les premières solutions fonctionne, mais pas aussi flexible que je l'espérais, la seconde échoue pour un cas d'utilisation, est cependant beaucoup plus générique.

Annonce 1) Je peux résoudre le problème en faisant passer la chaîne à ce sous-programme

    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

Ad 2) Cette routine ne prend plusieurs caractères offensants, mais pour ne 0x00. Cela a été adapté de MSDN, http://msdn.microsoft.com/en- nous / bibliothèque / 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
Était-ce utile?

La solution

Tout d'abord, vous devez savoir ce que le format du texte est, de sorte que vous aveuglément sans savoir quelque chose retirez ce que vous touchez.

En fonction du format, vous utilisez différentes méthodes pour supprimer les caractères.

Pour supprimer uniquement les caractères zéro:

Dim len As Integer = 0
For pos As Integer = 0 To byText.Length - 1
   If byText(pos) <> 0 Then
      byText(len) = byText(pos)
      len += 1
   End If
Next
strText = Encoding.ASCII.GetChars(byText, 0, len)

Pour supprimer tout du premier caractère zéro à la fin du tableau:

Dim len As Integer
While len < byText.Length AndAlso byText(len) <> 0
   len += 1
End While
strText = Encoding.ASCII.GetChars(byText, 0, len)

Edit:
Si vous voulez juste garder toute ordure qui se trouve être des caractères ASCII:

Dim len As Integer = 0
For pos As Integer = 0 To byText.Length - 1
   If byText(pos) >= 32 And byText(pos) <= 127 Then
      byText(len) = byText(pos)
      len += 1
   End If
Next
strText = Encoding.ASCII.GetChars(byText, 0, len)

Autres conseils

Si les caractères nuls sont utilisés comme rembourrage droit (par exemple se terminant ) le texte, ce qui serait le cas normal, cela est assez facile:

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

Sinon, vous pouvez toujours faire une Replace normale sur la chaîne. Il serait un peu plus « propre » si vous avez fait la taille dans le tableau d'octets, avant convertir en une chaîne. Le principe reste le même, cependant.

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)

Vous pouvez utiliser une struct pour charger les données:

[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;
}

Vous devez régler la UnmanagedType-Argument pour s'adapter à l'encodage de votre chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top