Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Text;
- using System.Runtime.InteropServices;
- namespace ConsoleApp4
- {
- [StructLayout(LayoutKind.Sequential)]
- struct Utf8Struct
- {
- [MarshalAs(UnmanagedType.LPUTF8Str, SizeConst = 30)]
- public string Value;
- }
- [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
- struct StrStruct
- {
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
- public string Value;
- }
- class Program
- {
- static void Main() {
- var stringValue = "测试文字一二";
- UTF8Test(stringValue);
- UnicodeTest(stringValue);
- Console.ReadLine();
- }
- public static void UTF8Test(string stringValue) {
- byte[] a = Encoding.UTF8.GetBytes(stringValue);
- Console.WriteLine(BitConverter.ToString(a).Replace("-", " "));
- var sizeOfStruct = Marshal.SizeOf<Utf8Struct>();
- var structPtr = Marshal.AllocHGlobal(Marshal.SizeOf<Utf8Struct>());
- Marshal.StructureToPtr(new Utf8Struct { Value = stringValue }, structPtr, false);
- var utf8Struct = Marshal.PtrToStructure<Utf8Struct>(structPtr);
- Console.WriteLine(utf8Struct.Value);
- var structAddress = Marshal.ReadIntPtr(structPtr);
- Console.WriteLine($"{structPtr.ToInt64():X}");
- Console.WriteLine($"{structAddress.ToInt64():X}");
- for (int i = 0; i <= sizeOfStruct * 2 + 1; i++) {
- Console.Write($"{Marshal.ReadByte(structAddress + i):X2} ");
- }
- Marshal.FreeHGlobal(structPtr);
- Console.WriteLine();
- }
- public static void UnicodeTest(string stringValue) {
- byte[] a = Encoding.Unicode.GetBytes(stringValue);
- Console.WriteLine(BitConverter.ToString(a).Replace("-", " "));
- var sizeOfStruct = Marshal.SizeOf<StrStruct>();
- var structPtr = Marshal.AllocHGlobal(Marshal.SizeOf<StrStruct>());
- Marshal.StructureToPtr(new StrStruct { Value = stringValue }, structPtr, false);
- var utf8Struct = Marshal.PtrToStructure<StrStruct>(structPtr);
- Console.WriteLine(utf8Struct.Value);
- var structAddress = Marshal.ReadIntPtr(structPtr);
- //var structAddress = structPtr;
- Console.WriteLine($"{structPtr.ToInt64():X}");
- Console.WriteLine($"{structAddress.ToInt64():X}");
- for (int i = 0; i <= sizeOfStruct * 2 + 1; i++) {
- Console.Write($"{Marshal.ReadByte(structPtr + i):X2} ");
- }
- Marshal.FreeHGlobal(structPtr);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement