2014-01-02 3 views
1

Я получаю данные от Device(Time attendance), используя библиотеку C++ в C# 4.0, проблема заключается в том, что с полем имени есть некоторая величина нежелательной почты.Удалить ненужное значение из строки

Поле имени - это массив байтов, и я попробовал использовать Encoding.Default.GetString(user.Name), здесь пользователь - это Struct.

[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

Вы должны использовать 'fixed' ключевое слово для' байт [] '. Затем просто используйте 'new string ((sbyte *) User.Name)'. См. MSDN для поведения по этому вопросу. – leppie

+0

Почему бы не объявить поле как 'String' напрямую? –

ответ

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; 

Было бы легче манипулировать в коде ...

+0

столько спасибо Томас. –

+1

более корректны, чем другие ответы, но лучше сделать байты перед созданием строки массива, потому что некоторые нетривиальные кодировки (например, UTF-8) требуют большей обработки и, если я правильно понимаю, могут даже сделать этот метод непригодным. –

0

сделать это так

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

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

ИЛИ

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

return str1 
+2

Это обыкновение даже смутно работать ... – leppie

+0

@Yanshof, спасибо за ответ, но все равно не повезло. получение значения того же типа. –

0

Вы имеете дело со строками с завершающим нулевым. Таким образом, вы хотите удалить нулевой байт и все байты после нулевого байта в своих массивах, прежде чем передавать его на Encoding.Default.GetString(byte[]).

Update:

Пример кода (может быть не очень оптимален):

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

RegEx является лучшим способом для удаления значения нежелательного, В этом примере с WI удалить весь символ, который не словом,

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

Вы можете найти полную библиотеку регулярных выражений на http://regexlib.com/

+0

Overkill и неэффективно. Это устраняет только симптом ошибки, а не сама ошибка. –

Смежные вопросы