[英]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
是什么。
Char
是WideChar
的別名,它是一種 16 位類型。Char
是AnsiChar
的別名, 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.