从字符串中删除垃圾值

时间:2014-01-02 09:02:21

标签: c# unmanaged

我在C#4.0中使用C ++库从Device(Time attendance)获取数据,问题是名称字段有一些垃圾值。

名称字段是字节数组,我尝试使用Encoding.Default.GetString(user.Name),此处用户是结构。

[StructLayout(LayoutKind.Sequential, Size = 48, CharSet = CharSet.Ansi), Serializable]
public struct User
  {
  public int ID; 
  [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 12)]
  public byte[] Name; 
}

输出

"Jon\0 41 0"
"rakesh\0 6"

我想删除\0 41 0\0 6

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:3)

保持简单:

static class StringExtensions
{
    public static string TrimNullTerminatedString(this string s)
    {
        if (s == null)
            throw new NotImplementedException();
        int i = s.IndexOf('\0');
        if (i >= 0)
            return s.Substring(0, i);
        return s;
    }
}

像这样使用:

string name = Encoding.Default.GetString(user.Name).TrimNullTerminatedString();

话虽如此,更好的选择是在声明级别处理。如果Name是字符串,则没有理由将其声明为byte[];将它声明为字符串,并且将正确处理空终止字符:

[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 12)]
public string Name;

在代码中操作也会更容易......

答案 1 :(得分:1)

RegEx是删除垃圾值的最佳方法,在本例中使用W我删除所有非字的字符,

textBox1.Text = Regex.Replace("rakesh\0 6", "W", "");

您可以在http://regexlib.com/

找到完整的正则表达式库

答案 2 :(得分:0)

这样做

Regex re = New Regex("[\x0A\x0D]", RegexOptions.Compiled)

str = re.Replace(str.Trim(), String.Empty)

OR

 string str1="";
 for(int i = 0 ; i < str.lengh ; i++) { 
         if(!char.IsLetter(str[i])
              str1 += str[i];
 }

return str1

答案 3 :(得分:0)

您正在处理以null结尾的字符串。因此,在将数据传递给Encoding.Default.GetString(byte[])之前,要在数组中的零字节之后删除零字节和所有字节。

更新

示例代码(可能不是非常优化):

static byte[] RemoveJunk(byte[] input)
{
    var end = Array.IndexOf(input, (byte)0);
    Console.WriteLine(end);
    if (end < 0)
        return input;
    var result = new byte[end];
    Array.Copy(input, result, end);
    return result;
}