2010-07-15 91 views
2

我正在使用C#和.NET 2.0框架。IntPtr字符串和長?

我有這樣的方法在這裏得到一個字符串了IntPtr的:

void* cfstring = __CFStringMakeConstantString(StringToCString(name)); 
     IntPtr result = AMDeviceCopyValue_Int(device, unknown, cfstring); 
     if (result != IntPtr.Zero) 
     { 
      byte length = Marshal.ReadByte(result, 8); 
      if (length > 0) 
      { 
       string s = Marshal.PtrToStringAnsi(new IntPtr(result.ToInt64() + 9L), length); 
       return s; 
      } 
     } 
     return String.Empty; 

它的工作原理和它在我的USB設備保存爲字符串的所有數據(返回方法AMDeviceCopyValue的數據)。

現在我得到這樣的:

£\rº\ 0 \ 0A \ t \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0X> 0 \ 0 \ 0 \ 0 \ 0A \噸\ 0 \ 0 \ 0€1ÔxÕ͸MÔ\ 0 \ 0 \ 0 \ 0E \噸\ 0 \ 0 \ 0€)\0fŒ\一個\ 0Value \ 0 \ 0E \噸\ 0 \ 0 \ 0€7fŒ\一個\ 0Result \ 0I \噸\ 0 \ 0 \0TÅfŒ\一個\ 0 \ 0Key \ 0 \ 0 \ 0 \ 0N \噸\ 0 \ 0 \ 0€+ FOE \一個\ 0Port \ 0 \ 0 \ 0°\噸\ 0 \ 0 \ 0€%FOE \一個\ 0Key \ 0 \ 0 \ 0 \ 0÷¨\噸\ 0 \ 0 \ 0€:\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 U \ t \ 0"

這被保存爲long - 所以,我怎麼能得到這個IntPtrlong和不是string

回答

3

如果你只是想讀長,而不是字符串,使用:

long l = Marshal.ReadInt64(result, 9); 
return l; 
+0

可悲的是不是我想要的... =(我不知道爲什麼,你的解決方案似乎是正確 – Kovu 2010-07-15 10:21:10

+0

我要回答問題:'我怎樣才能得到這個IntPtr長,而不是字符串' - 提取結果+偏移量9指向的長地址。那麼,你準確地要做什麼?我真的不知道'AMDeviceCopyValue_Int'返回的數據結構如何,所以在這方面我無法幫到你。你甚至使用正確的功能來提取「長」? – 2010-07-15 10:36:08

+0

這是在Java中解決同樣的過程:http://stackoverflow.com/questions/3254602/convert-a-method-from-java-to-c-net 但不是我必須解決它或轉換此方法來c#.net – Kovu 2010-07-15 10:40:22