I'm using a low level native API where I send an unsafe byte buffer pointer to get a c-string value.
So it gives me
// using byte[255] c_str
string s = new string(Encoding.ASCII.GetChars(c_str));
// now s == "heresastring\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(etc)";
So obviously I'm not doing it right, how I get rid of the excess?
.NET strings are not null-terminated (as you may have guessed from this). So, you can treat the '\0' as you would treat any normal character. Normal string manipulation will fix things for you. Here are some (but not all) options.
s = s.Trim('\0');
s = s.Replace("\0", "");
var strings = s.Split(new char[] {'\0'}, StringSplitOptions.RemoveEmptyEntries);
If you definitely want to throw away any values after the first null character, this might work better for you. But be careful, it only works on strings that actually include the null character.
s = s.Substring(0, Math.Max(0, s.IndexOf('\0')));
There may be an option to strip NULs in the conversion.
Beyond that, you could probably clean it up with:
s = s.Trim('\0');
...or, if you think there may be non-NUL characters after some NULs, this may be safer:
int pos = s.IndexOf('\0');
if (pos >= 0)
s = s.Substring(0, pos);
// s == "heresastring\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(etc)"
s = s.Split(new[] { '\0' }, 2)[0];
// s == "heresastring"
How about one of the System.Runtime.InteropServices.Marshall.PtrToString* methods?
Marshal.PtrToStringAnsi - Copies all characters up to the first null character from an unmanaged ANSI string to a managed String, and widens each ANSI character to Unicode.
Marshal.PtrToStringUni - Allocates a managed String and copies all or part to the first null of an unmanaged Unicode string into it.
I believe \0 is "null" in ascii -- are you sure the string you're getting is actually ascii encoded?
来源:https://stackoverflow.com/questions/2581325/help-with-0-terminated-strings-in-c-sharp