Advertisement
Guest User

Untitled

a guest
Dec 5th, 2020
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. using System;
  2. using System.Text;
  3. using System.Runtime.InteropServices;
  4.  
  5. namespace ConsoleApp4
  6. {
  7. [StructLayout(LayoutKind.Sequential)]
  8. struct Utf8Struct
  9. {
  10. [MarshalAs(UnmanagedType.LPUTF8Str, SizeConst = 30)]
  11. public string Value;
  12. }
  13.  
  14. [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
  15. struct StrStruct
  16. {
  17. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
  18. public string Value;
  19. }
  20. class Program
  21. {
  22. static void Main() {
  23.  
  24. var stringValue = "测试文字一二";
  25. UTF8Test(stringValue);
  26. UnicodeTest(stringValue);
  27.  
  28.  
  29. Console.ReadLine();
  30. }
  31.  
  32. public static void UTF8Test(string stringValue) {
  33. byte[] a = Encoding.UTF8.GetBytes(stringValue);
  34. Console.WriteLine(BitConverter.ToString(a).Replace("-", " "));
  35.  
  36. var sizeOfStruct = Marshal.SizeOf<Utf8Struct>();
  37. var structPtr = Marshal.AllocHGlobal(Marshal.SizeOf<Utf8Struct>());
  38. Marshal.StructureToPtr(new Utf8Struct { Value = stringValue }, structPtr, false);
  39. var utf8Struct = Marshal.PtrToStructure<Utf8Struct>(structPtr);
  40. Console.WriteLine(utf8Struct.Value);
  41. var structAddress = Marshal.ReadIntPtr(structPtr);
  42. Console.WriteLine($"{structPtr.ToInt64():X}");
  43. Console.WriteLine($"{structAddress.ToInt64():X}");
  44. for (int i = 0; i <= sizeOfStruct * 2 + 1; i++) {
  45. Console.Write($"{Marshal.ReadByte(structAddress + i):X2} ");
  46. }
  47. Marshal.FreeHGlobal(structPtr);
  48. Console.WriteLine();
  49. }
  50.  
  51. public static void UnicodeTest(string stringValue) {
  52. byte[] a = Encoding.Unicode.GetBytes(stringValue);
  53. Console.WriteLine(BitConverter.ToString(a).Replace("-", " "));
  54.  
  55. var sizeOfStruct = Marshal.SizeOf<StrStruct>();
  56. var structPtr = Marshal.AllocHGlobal(Marshal.SizeOf<StrStruct>());
  57. Marshal.StructureToPtr(new StrStruct { Value = stringValue }, structPtr, false);
  58. var utf8Struct = Marshal.PtrToStructure<StrStruct>(structPtr);
  59. Console.WriteLine(utf8Struct.Value);
  60.  
  61. var structAddress = Marshal.ReadIntPtr(structPtr);
  62. //var structAddress = structPtr;
  63. Console.WriteLine($"{structPtr.ToInt64():X}");
  64. Console.WriteLine($"{structAddress.ToInt64():X}");
  65. for (int i = 0; i <= sizeOfStruct * 2 + 1; i++) {
  66. Console.Write($"{Marshal.ReadByte(structPtr + i):X2} ");
  67. }
  68. Marshal.FreeHGlobal(structPtr);
  69. }
  70. }
  71. }
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement