我在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
。
任何帮助都将不胜感激。
答案 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", "");
找到完整的正则表达式库
答案 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;
}