问题
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?
回答1:
.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')));
回答2:
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);
回答3:
// 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"
回答4:
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.
回答5:
I believe \0 is "null" in ascii -- are you sure the string you're getting is actually ascii encoded?
回答6:
The safest way is to use:
s = s.Replace("\0", "");
来源:https://stackoverflow.com/questions/2581325/help-with-0-terminated-strings-in-c-sharp