heting
BlogJava
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
::
40 隨筆 :: 9 文章 :: 45 評論 :: 0 Trackbacks
<
2010年3月
>
日
一
二
三
四
五
六
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(3)
給我留言
查看公開留言
查看私人留言
隨筆分類
c#范例(4)
(rss)
java范例
(rss)
js(3)
(rss)
linux(1)
(rss)
WebSphere(1)
(rss)
數據庫(3)
(rss)
隨筆檔案
2010年10月 (1)
2010年8月 (5)
2010年3月 (2)
2009年11月 (2)
2009年9月 (1)
2009年8月 (1)
2009年7月 (2)
2009年5月 (1)
2009年4月 (3)
2009年3月 (4)
2009年2月 (1)
2009年1月 (3)
2008年12月 (2)
2008年11月 (7)
2008年10月 (4)
2008年9月 (1)
文章檔案
2008年9月 (9)
搜索
最新評論
1.?re: struts2+freemarker中防止表單的重復提交token
@51互聯云-濟南程序猿
你什么都不懂,瞎說
--人
2.?re: struts2+freemarker中防止表單的重復提交token
沒關系,大家好,什么都沒有
--人
3.?re: struts2+freemarker中防止表單的重復提交token
套頭
--人
4.?re: struts2+freemarker中防止表單的重復提交token
評論內容較長,點擊標題查看
--51互聯云-濟南程序猿
5.?re: struts1文件上傳和下載
評論內容較長,點擊標題查看
--zuidaima
閱讀排行榜
1.?struts1文件上傳和下載(21131)
2.?javax.naming.CommunicationException 的一個相關異常(已解決)(11551)
3.?自己寫的一個c#winform打印類(8505)
4.?C# 與 C++ 數據類型比較及結構體轉換 (7217)
5.?WebSphere7.0 上部署struts2 找不到用于處理 JSP 的擴展處理器(2983)
評論排行榜
1.?struts1文件上傳和下載(23)
2.?自己寫的一個c#winform打印類(8)
3.?struts2+freemarker中防止表單的重復提交token(6)
4.?Ireport在瀏覽器中的顯示代碼(2)
5.?EJ3.0將EJB程序和WEb程序發布到weblogic10.3是出現的錯誤weblogic.wsee.async.AsyncResponseBean(2)
C# 與 C++ 數據類型比較及結構體轉換
C
++
C#
=====================================
WORD
ushort
DWORD
uint
UCHAR
int
/
byte
大部分情況都可以使用int代替,而如果需要嚴格對齊的話則應該用bytebyte
UCHAR
*
string
/
IntPtr
unsigned
char
*
[MarshalAs(UnmanagedType.LPArray)]
byte
[]
/
?(Intptr)
char
*
string
LPCTSTR
string
LPTSTR [MarshalAs(UnmanagedType.LPTStr)]
string
long
int
ulong
uint
Handle IntPtr
HWND IntPtr
void
*
IntPtr
int
int
int
*
ref
int
*
int
IntPtr
unsigned
int
uint
COLORREF
uint
API與C#的數據類型對應關系表
API數據類型 類型描述 C#類型 API數據類型 類型描述 C#類型
WORD 16位無符號整數
ushort
CHAR 字符
char
LONG 32位無符號整數
int
DWORDLONG 64位長整數
long
DWORD 32位無符號整數
uint
HDC 設備描述表句柄
int
HANDLE 句柄,32位整數
int
HGDIOBJ GDI對象句柄
int
UINT 32位無符號整數
uint
HINSTANCE 實例句柄
int
BOOL 32位布爾型整數
bool
HWM 窗口句柄
int
LPSTR 指向字符的32位指針
string
HPARAM 32位消息參數
int
LPCSTR 指向常字符的32位指針 String LPARAM 32位消息參數
int
BYTE 字節
byte
WPARAM 32位消息參數
int
BOOL
=
System.Int32
BOOLEAN
=
System.Int32
BYTE
=
System.UInt16
CHAR
=
System.Int16
COLORREF
=
System.UInt32
DWORD
=
System.UInt32
DWORD32
=
System.UInt32
DWORD64
=
System.UInt64
FLOAT
=
System.Float
HACCEL
=
System.IntPtr
HANDLE
=
System.IntPtr
HBITMAP
=
System.IntPtr
HBRUSH
=
System.IntPtr
HCONV
=
System.IntPtr
HCONVLIST
=
System.IntPtr
HCURSOR
=
System.IntPtr
HDC
=
System.IntPtr
HDDEDATA
=
System.IntPtr
HDESK
=
System.IntPtr
HDROP
=
System.IntPtr
HDWP
=
System.IntPtr
HENHMETAFILE
=
System.IntPtr
HFILE
=
System.IntPtr
HFONT
=
System.IntPtr
HGDIOBJ
=
System.IntPtr
HGLOBAL
=
System.IntPtr
HHOOK
=
System.IntPtr
HICON
=
System.IntPtr
HIMAGELIST
=
System.IntPtr
HIMC
=
System.IntPtr
HINSTANCE
=
System.IntPtr
HKEY
=
System.IntPtr
HLOCAL
=
System.IntPtr
HMENU
=
System.IntPtr
HMETAFILE
=
System.IntPtr
HMODULE
=
System.IntPtr
HMONITOR
=
System.IntPtr
HPALETTE
=
System.IntPtr
HPEN
=
System.IntPtr
HRGN
=
System.IntPtr
HRSRC
=
System.IntPtr
HSZ
=
System.IntPtr
HWINSTA
=
System.IntPtr
HWND
=
System.IntPtr
INT
=
System.Int32
INT32
=
System.Int32
INT64
=
System.Int64
LONG
=
System.Int32
LONG32
=
System.Int32
LONG64
=
System.Int64
LONGLONG
=
System.Int64
LPARAM
=
System.IntPtr
LPBOOL
=
System.Int16[]
LPBYTE
=
System.UInt16[]
LPCOLORREF
=
System.UInt32[]
LPCSTR
=
System.String
LPCTSTR
=
System.String
LPCVOID
=
System.UInt32
LPCWSTR
=
System.String
LPDWORD
=
System.UInt32[]
LPHANDLE
=
System.UInt32
LPINT
=
System.Int32[]
LPLONG
=
System.Int32[]
LPSTR
=
System.String
LPTSTR
=
System.String
LPVOID
=
System.UInt32
LPWORD
=
System.Int32[]
LPWSTR
=
System.String
LRESULT
=
System.IntPtr
PBOOL
=
System.Int16[]
PBOOLEAN
=
System.Int16[]
PBYTE
=
System.UInt16[]
PCHAR
=
System.Char[]
PCSTR
=
System.String
PCTSTR
=
System.String
PCWCH
=
System.UInt32
PCWSTR
=
System.UInt32
PDWORD
=
System.Int32[]
PFLOAT
=
System.Float[]
PHANDLE
=
System.UInt32
PHKEY
=
System.UInt32
PINT
=
System.Int32[]
PLCID
=
System.UInt32
PLONG
=
System.Int32[]
PLUID
=
System.UInt32
PSHORT
=
System.Int16[]
PSTR
=
System.String
PTBYTE
=
System.Char[]
PTCHAR
=
System.Char[]
PTSTR
=
System.String
PUCHAR
=
System.Char[]
PUINT
=
System.UInt32[]
PULONG
=
System.UInt32[]
PUSHORT
=
System.UInt16[]
PVOID
=
System.UInt32
PWCHAR
=
System.Char[]
PWORD
=
System.Int16[]
PWSTR
=
System.String
REGSAM
=
System.UInt32
SC_HANDLE
=
System.IntPtr
SC_LOCK
=
System.IntPtr
SHORT
=
System.Int16
SIZE_T
=
System.UInt32
SSIZE_
=
System.UInt32
TBYTE
=
System.Char
TCHAR
=
System.Char
UCHAR
=
System.Byte
UINT
=
System.UInt32
UINT32
=
System.UInt32
UINT64
=
System.UInt64
ULONG
=
System.UInt32
ULONG32
=
System.UInt32
ULONG64
=
System.UInt64
ULONGLONG
=
System.UInt64
USHORT
=
System.UInt16
WORD
=
System.UInt16
WPARAM
=
System.IntPtr
<---------
補充
----------->
Wtypes.h 中的非托管類型 非托管C 語言類型 托管類名 說明
HANDLE
void
*
System.IntPtr
32
位
BYTE unsigned
char
System.Byte
8
位
SHORT
short
System.Int16
16
位
WORD unsigned
short
System.UInt16
16
位
INT
int
System.Int32
32
位
UINT unsigned
int
System.UInt32
32
位
LONG
long
System.Int32
32
位
BOOL
long
System.Int32
32
位
DWORD unsigned
long
System.UInt32
32
位
ULONG unsigned
long
System.UInt32
32
位
CHAR
char
System.Char 用 ANSI 修飾。
LPSTR
char
*
System.String 或 System.StringBuilder 用 ANSI 修飾。
LPCSTR Const
char
*
System.String 或 System.StringBuilder 用 ANSI 修飾。
LPWSTR wchar_t
*
System.String 或 System.StringBuilder 用 Unicode 修飾。
LPCWSTR Const wchar_t
*
System.String 或 System.StringBuilder 用 Unicode 修飾。
FLOAT Float System.Single
32
位
DOUBLE Double System.Double
64
位
C
/
C
++
中的結構類型數據在C#下的轉換
在做項目移植的時候,經常會碰到數據類型的轉換,而我這一次碰到的是C
/
C
++
中的結構怎樣轉換到C#。折騰了一個晚上終于有一個完美的方案。
例如我們在C
/
C
++
下的結構數據如下:
typedef
struct
{
char
sLibName[
256
];
char
sPathToLibrary[
256
];
INT32 iEntries;
INT32 iUsed;
UINT16 iSort;
UINT16 iVersion;
BOOLEAN fContainsSubDirectories;
INT32 iReserved;
}
LIBHEADER;
我們想把它轉成C#下的結構類型如下:
public
struct
LIBHEADER
{
public
char
[] sLibName;
public
char
[] sPathToLibrary;
public
Int32 iEntries;
public
Int32 iUsed;
public
UInt16 iSort;
public
UInt16 iVersion;
public
Boolean fContainsSubDirectories;
public
Int32 iReserved;
}
看上去好像沒問題了,呵呵呵,其實這樣是不行的,我們得再給C#編譯器一些信息,告訴它一些字符數組的大小。然后它們在C#下面長得樣子就變成這樣:
[StructLayout(LayoutKind.Sequential)]
public
struct
LIBHEADER
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst
=
256
)]
public
char
[] sLibName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst
=
256
)]
public
char
[] sPathToLibrary;
public
Int32 iEntries;
public
Int32 iUsed;
public
UInt16 iSort;
public
UInt16 iVersion;
public
Boolean fContainsSubDirectories;
public
Int32 iReserved;
}
然后寫一個函數負責轉換。
public
StructType ConverBytesToStructure
<
StructType
>
(
byte
[] bytesBuffer)
{
//
檢查長度。
if
(bytesBuffer.Length
!=
Marshal.SizeOf(
typeof
(StructType)))
{
throw
new
ArgumentException(
"
bytesBuffer參數和structObject參數字節長度不一致。
"
);
}
IntPtr bufferHandler
=
Marshal.AllocHGlobal(bytesBuffer.Length);
for
(
int
index
=
0
; index
<
bytesBuffer.Length; index
++
)
{
Marshal.WriteByte(bufferHandler, index, bytesBuffer[index]);
}
StructType structObject
=
(StructType)Marshal.PtrToStructure(bufferHandler,
typeof
(StructType));
Marshal.FreeHGlobal(bufferHandler);
return
structObject;
}
然后我們的函數用例是這樣:
FileStream file
=
File.OpenRead(
@"
D:\Jagged Alliance 2 Gold\INSTALL.LOG
"
);
byte
[] buffer
=
new
byte
[Marshal.SizeOf(
typeof
(LIBHEADER))];
file.Read(buffer,
0
, buffer.Length);
LIBHEADER testValue
=
CommonTools.ConverBytesToStructure
<
LIBHEADER
>
(buffer);
string
libName
=
new
string
(testValue.sLibName);
string
pathToLibrary
=
new
string
(testValue.sPathToLibrary);
OK,搞定。
如果想去掉后面兩句的char數組的轉換哪代碼如下
C#中的結構代碼
[StructLayout(LayoutKind.Sequential, CharSet
=
CharSet.Ansi)]
public
struct
LIBHEADER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst
=
256
)]
public
string
sLibName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst
=
256
)]
public
string
sPathToLibrary;
public
Int32 iEntries;
public
Int32 iUsed;
public
UInt16 iSort;
public
UInt16 iVersion;
public
Boolean fContainsSubDirectories;
public
Int32 iReserved;
}
其它代碼不用作修改便可使用。
posted on 2010-03-20 10:40
賀挺
閱讀(7217)
評論(0)
編輯
收藏
所屬分類:
c#范例
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
AxWindowsMediaPlayer的詳細用法
C# 與 C++ 數據類型比較及結構體轉換
自己寫的一個c#winform打印類
c# winform 打印類
Powered by:
BlogJava
Copyright © 賀挺
主站蜘蛛池模板:
衢州市
|
安福县
|
体育
|
瑞安市
|
托里县
|
平遥县
|
绥化市
|
凌源市
|
若羌县
|
乌兰县
|
毕节市
|
万源市
|
苍南县
|
麻阳
|
贵溪市
|
晋中市
|
富源县
|
柏乡县
|
兴山县
|
庄浪县
|
集安市
|
柳州市
|
贵阳市
|
乐东
|
达拉特旗
|
会同县
|
犍为县
|
白水县
|
高雄市
|
襄垣县
|
太谷县
|
宁武县
|
清徐县
|
新昌县
|
东乌珠穆沁旗
|
库尔勒市
|
拉孜县
|
北流市
|
孝义市
|
外汇
|
青川县
|