CorCompare work
[mono.git] / mcs / class / corlib / System.Text / ASCIIEncoding.cs
index 6d394217aa22508878f0a49473e2d55081c056e6..bb2ff31ac09816ee0ea7d13bb54102082c90998b 100644 (file)
@@ -34,7 +34,7 @@ using System.Runtime.InteropServices;
 #if NET_2_0
 [ComVisible (true)]
 #endif
-[MonoTODO ("Fix serialization compatibility with MS.NET")]
+[MonoTODO ("Serialization format not compatible with .NET")]
 public class ASCIIEncoding : Encoding
 {
        // Magic number used by Windows for "ASCII".
@@ -310,8 +310,26 @@ public class ASCIIEncoding : Encoding
                        return String.Empty;
                
                unsafe {
-                       fixed (byte *ss = &bytes [0]) {
-                               return new String ((sbyte*)ss, index, count);
+                       fixed (byte* bytePtr = bytes) {
+                               string s = string.InternalAllocateStr (count);
+
+                               fixed (char* charPtr = s) {
+                                       byte* currByte = bytePtr + index;
+                                       byte* lastByte = currByte + count;
+                                       char* currChar = charPtr;
+
+                                       while (currByte < lastByte) {
+#if NET_2_0
+                                               byte b = currByte++ [0];
+                                               currChar++ [0] = b <= 0x7F ? (char) b : (char) '?';
+#else
+                                               // GetString is incompatible with GetChars
+                                               currChar++ [0] = (char) (currByte++ [0] & 0x7F);
+#endif
+                                       }
+                               }
+
+                               return s;
                        }
                }
        }
@@ -383,14 +401,8 @@ public class ASCIIEncoding : Encoding
                if (bytes == null) {
                        throw new ArgumentNullException ("bytes");
                }
-               int count = bytes.Length;
-               if (count == 0)
-                   return String.Empty;
-               unsafe {
-                       fixed (byte *ss = &bytes [0]) {
-                               return new String ((sbyte*)ss, 0, count);
-                       }
-               }
+
+               return GetString (bytes, 0, bytes.Length);
        }
 #endif