@@ -512,19 +512,53 @@ public static string[] MemoryToStringArray
512512 Func < nint , string > customUnmarshaller
513513 ) => PtrToStringArray ( input , input . Length / IntPtr . Size , customUnmarshaller ) ;
514514
515- private static unsafe string Utf8PtrToString ( nint ptr )
515+ /// <summary>
516+ /// Gets the length of the given native string.
517+ /// </summary>
518+ /// <param name="ptr">The native string pointer.</param>
519+ /// <param name="encoding">The encoding.</param>
520+ /// <returns>The length of the string.</returns>
521+ /// <remarks>
522+ /// Note that this returns the length in characters. Namely, if a 16-bit character encoding is used, the actual
523+ /// byte count will be double the return value from this function.
524+ /// </remarks>
525+ #if NET6_0_OR_GREATER
526+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
527+ public static unsafe nuint StringLength (
528+ nint ptr ,
529+ NativeStringEncoding encoding = NativeStringEncoding . Ansi
530+ ) =>
531+ ( nuint ) (
532+ encoding == NativeStringEncoding . LPWStr
533+ ? MemoryMarshal . CreateReadOnlySpanFromNullTerminated ( ( char * ) ptr ) . Length
534+ : MemoryMarshal . CreateReadOnlySpanFromNullTerminated ( ( byte * ) ptr ) . Length
535+ ) ;
536+ #else
537+ public static unsafe nuint StringLength (
538+ nint ptr ,
539+ NativeStringEncoding encoding = NativeStringEncoding . Ansi
540+ )
516541 {
517- var span = new Span < byte > ( ( void * ) ptr , int . MaxValue ) ;
518- span = span . Slice ( 0 , span . IndexOf ( default ( byte ) ) ) ;
519- if ( span . Length == 0 )
542+ if ( ptr == 0 )
520543 {
521- return string . Empty ;
544+ return 0 ;
522545 }
546+ nuint ret ;
547+ for (
548+ ret = 0 ;
549+ encoding == NativeStringEncoding . LPWStr
550+ ? ( ( char * ) ptr ) ! [ ret ] != 0
551+ : ( ( byte * ) ptr ) ! [ ret ] != 0 ;
552+ ret ++
553+ ) { }
554+ return ret ;
555+ }
556+ #endif
523557
524- fixed ( byte * bytes = span )
525- {
526- return Encoding . UTF8 . GetString ( bytes , span . Length ) ;
527- }
558+ private static unsafe string Utf8PtrToString ( nint ptr )
559+ {
560+ var len = ( int ) StringLength ( ptr , NativeStringEncoding . UTF8 ) ;
561+ return len == 0 ? string . Empty : Encoding . UTF8 . GetString ( ( byte * ) ptr , len ) ;
528562 }
529563
530564 // "Unsafe" methods
0 commit comments