iT邦幫忙

0

在C使用的指標技巧,如何在C# 中實現??

  • 分享至 

  • xImage

在C中建立一個struct Mystruct
typedef struct
{
int a1
char a2
.
.
.
}Mystruct;

有一個char 的陣列
char Array[64];

當我將這個陣列指項這個結構時
Mystruct* MyStructPoint = (MyLinkData*) Array;

這樣我就可以使這個陣列的資料透過結構指標的資料型態直接讀取這個Array的值,或我可以讓MyStructPoint++ 直接指到Mystruct 資料長度的Array的位子。

那再C#中,我該怎樣實現類似的這樣功能,或是有其他快速的方法可以把讀近來的Array 賦予給某一個物件。

-------------------經過研究後 發現可以這樣做--------------------
以下為byte array to Sturct 的方法

public object ByteToStruct(byte[] bytes, Type StructType)
{
  //取得StructType的位元數目
  int size = Marshal.SizeOf(StructType); 
  
  //透過目前取的為的元數目產生一個未被約束的記憶體空間,
  //回傳新配置的記憶體的指標。
  IntPtr Buffer = Marshal.AllocHGlobal(size);         

  try
  {
    //將byte複製到記憶體空間中
    Marshal.Copy(bytes, 0, Buffer, size);       
    //回傳將記憶體指針內容轉換成被約束的記憶體型態為StructType
    return Marshal.PtrToStructure(Buffer, StructType);       
  }
  finally
  {
    //釋放記憶體空間 
    Marshal.FreeHGlobal(Buffer);
  }
}

以下為宣告 struct 注意事項

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct THeader
{
   public short _Version;
   public byte _type;
   public int _TextBase;
  
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.SysInt)]
   public byte[] _Name;
   
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
   public string _address;   
   
}

StructLayout---sturct佈局方式
Sequential-----表示在記憶體中按位元組對齊連續儲存
Pack---------- 指定位元組對齊方式
SizeConst------指明下面變數元素個數 如果為陣列就是陣列個數
MarshalAs------用來說明下一個欄位在複製到非託管區域時的轉換方式和長度

然後再透過Marshal.SizeOf ,Array.Copy,Array.Resize就可以實現直接將byte[] array 指定給不同size的Struct中

wrxue iT邦好手 1 級 ‧ 2022-01-22 02:15:14 檢舉
不就直接傳就好了?沒問題吧
w9190040 iT邦新手 5 級 ‧ 2022-01-22 05:09:27 檢舉
是可以直接傳 只是看看有沒有更好的方法 畢竟一個一個添有點慢 而且又費時
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

4
I code so I am
iT邦高手 1 級 ‧ 2022-01-22 10:06:58

大部分語言傳輸陣列參數都是以址傳遞(Call by Address),所以,使用迴圈讀寫 Array[i],即相當於指標++。

我要發表回答

立即登入回答