From: Olly B. <ol...@su...> - 2006-05-09 20:28:42
|
On 2006-05-09, William S Fulton <ws...@fu...> wrote: > Olly Betts wrote: >> Both C# and C++ are happy to handle string objects containing zero >> bytes, but SWIG generated C# bindings truncate strings at a zero byte. >> Looking at the generated code it just uses c_str() of the C++ string >> so this isn't altogether suprising. >> >> Is it possible to fix this? It looks like there's some implicit >> pinvoke magic which handles mapping a const char * to/from a C# string >> so I've nothing specific to google for (a few general searches haven't >> turned up anything useful.) > > Maybe I've been missing something all my years doing C, but if there is > a '\0' in a char *, and it does not terminate the string, then it is not > a string, rather an array of bytes. In C, yes, but I'm talking about C++ string objects (i.e the std::string class) which can contain zero bytes. To preserve them you need to use the data() and size() (or length()) methods to get a pointer and length, instead of c_str() which ensures a zero-terminated string. So for example, PHP's typemaps have: %typemap(out) string { ZVAL_STRINGL($result,const_cast<char*>($1.data()),$1.length(),1); } > strncpy might be able to copy these 'strings' with '\0', but any > string handling functions such as printf will truncate the string. It's true that you need to take care (or perhaps better avoid) passing C++ strings to C functions if you want the zero bytes to be handled, but you if you stick to C++ stuff it all works. For example use: cout << str << endl; instead of: printf("%s\n", str.c_str()); > As for marshalling C char* <-> C# string, the pinvoke marshaller expects > a null terminated string as that is the way strings work. You'd probably > have to marshall as a C# array if you want to keep the NULLs. Can you then unmarshall that as a C# string? I realise this is a bit of a corner case, but it's a bit sad that both C++ and C# have fixed C's inability to handle strings with zero bytes but you don't appear to be able to move such strings between the two! Cheers, Olly |