00001 using System; 00002 using System.Collections; 00003 using System.Runtime.InteropServices; 00004 00005 namespace SQLiteCSLib.Inner 00006 { 00010 public class StringFromC 00011 { 00017 unsafe static public string String( void* str ) 00018 { 00019 IntPtr ValPtr = new IntPtr( str ); 00020 #if MOBILEPC 00021 return Marshal.PtrToStringUni( ValPtr ); 00022 #else 00023 return Marshal.PtrToStringAuto( ValPtr ); 00024 #endif 00025 } 00026 00032 unsafe static public string String( IntPtr ValPtr ) 00033 { 00034 #if MOBILEPC 00035 return Marshal.PtrToStringUni( ValPtr ); 00036 #else 00037 return Marshal.PtrToStringAuto( ValPtr ); 00038 #endif 00039 } 00040 00046 unsafe static public string StringAnsi( IntPtr ValPtr ) 00047 { 00048 #if MOBILEPC 00049 ArrayList ansistr = new ArrayList(); 00050 int iTop = ValPtr.ToInt32(); 00051 00052 while( true ) 00053 { 00054 IntPtr pPos = new IntPtr(iTop++); 00055 byte bBin = Marshal.ReadByte( pPos ); 00056 if( bBin == 0x00 ) 00057 { 00058 break; 00059 } 00060 00061 ansistr.Add( bBin ); 00062 } 00063 00064 byte[] ansibin = ansistr.ToArray( typeof(byte) ) as byte[]; 00065 System.Text.Decoder dec = System.Text.Encoding.ASCII.GetDecoder(); 00066 int iLen = ansibin.Length; 00067 char[] cChars= new char[iLen]; 00068 dec.GetChars(ansibin,0,iLen, cChars, 0 ); 00069 return new string(cChars); 00070 #else 00071 return Marshal.PtrToStringAnsi( ValPtr ); 00072 #endif 00073 } 00074 00081 unsafe static public string String( void* str, int isize ) 00082 { 00083 IntPtr ValPtr = new IntPtr( str ); 00084 #if MOBILEPC 00085 return Marshal.PtrToStringUni( ValPtr, isize ); 00086 #else 00087 return Marshal.PtrToStringAuto( ValPtr, isize ); 00088 #endif 00089 } 00090 00097 unsafe static public string String( IntPtr ValPtr, int isize ) 00098 { 00099 #if MOBILEPC 00100 return Marshal.PtrToStringUni( ValPtr, isize ); 00101 #else 00102 return Marshal.PtrToStringAuto( ValPtr, isize ); 00103 #endif 00104 } 00105 } 00106 }