簡體   English   中英

在 Marshal.PtrToStructure 中沒有獲得正確的字符數

[英]Not getting correct number of characters in Marshal.PtrToStructure

我已經根據從 delphi 中讀取二進制文件從 delphi 打包記錄中正確的結構布局提出了當前的 c# 結構

現在我的問題是我沒有從文件中獲得正確的值

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct test {
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
  string field1;
  ...
}

她的就是德爾福記錄

char3 = Array[0..2] of Char;

test = Record
  field1: char3;
  ...

編輯:

正如我在對大衛回答的評論中所說的那樣。 問題是我缺少部分字符串。 按照大衛的答案使用byte[]而不是string ,我的代碼現在可以工作了。

以防萬一有人在C# 中偶然發現了這條delphi 記錄,這有點令人困惑,因為它假定 delphi 字符串以空字符結尾。

同樣關於StructLayout Pack屬性,即使您正在轉換的 Delphi 記錄沒有指示它,也只需嘗試將其設置為 1。 如果我遺漏了有關Pack請在評論中糾正我。 謝謝

至於我的最終結構:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct test {
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
  byte[] field1;
  ...
}

問題中代碼的正確性完全取決於Char是什么。

  • 在 Delphi 2009 及更高版本中, CharWideChar的別名,它是一種 16 位類型。
  • 在早期版本中, CharAnsiChar的別名, AnsiChar是 8 位類型。

因此,如果您使用的是早於 Delphi 2009 的 Delphi 版本,則您的代碼是正確的。否則,您的 C# 代碼應將CharSet.Ansi替換為CharSet.Unicode

另一個區別是 C# 代碼堅持以空值結尾的數組,而 Delphi 代碼則不需要。 因此,如果您的 Delphi 代碼想要將所有三個元素都用作非空值,那么您需要避免在 C# 端使用string 它會變成:

[StructLayout(LayoutKind.Sequential)]
struct test {
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
  byte[] field1;
  ...
}

對於 Unicode 之前的 Delphi,或

[StructLayout(LayoutKind.Sequential)]
struct test {
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
  char[] field1;
  ...
}

對於 Unicode Delphi。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM