2017-03-08 29 views
0

我在C#程序中使用的外部DLL爲我提供了一個指向內存位置的指針。從那裏,我在該位置的以下200個字節中讀入一個字節數組,然後將其轉換爲一個字符串。在將字節數組轉換爲字符串時修剪填充值

問題:大多數情況下,我的代碼可以工作,但它也讀取了用作填充(似乎是205)的DLL的值。

嘗試:我試着用這個Stack Overflow post的例子修剪字符串,但是填充仍然存在。我的代碼如下:

const int BYTES_PER_DEVICE_NAME = 200; 
const char PADDING_VALUE = (char)205; 
const char NULL_VALUE = (char)0; 

IntPtr nameAddress = (IntPtr)myDLL.GetPointer(); 

// Only run if the pointer is not to a null value 
if (nameAddress != IntPtr.Zero) 
{ 
    byte[] nameAsBytes = new byte[BYTES_PER_DEVICE_NAME]; 
    Marshal.Copy(nameAddress, nameAsBytes, 0, BYTES_PER_DEVICE_NAME); 
    string nameAsString = System.Text.Encoding.UTF8.GetString(nameAsBytes).TrimEnd(new char[] { PADDING_VALUE, NULL_VALUE }); 

    // Add the string to deviceNames, a string array 
    deviceNames[n] = nameAsString; 
} 

如下所示,即使我用TrimEnd()字符串nameAsString最終仍包含空和填充的值。

Padded values in a String


我目前想看看我是否能在我的nameAsBytes字節數組找到\0的指數,只有解析字節,直到該索引。但是,仍然,我在做什麼錯誤TrimEnd()

回答

2

一旦字節數組被轉換爲它是在編碼UTF16一個.NET串,和炭(205)不會有你正在尋找的效果。任何大於127的值都可能最終映射到轉換後的其他代碼點。

嘗試刪除205的之前轉換爲字符串。

const int BYTES_PER_DEVICE_NAME = 200; 
const char PADDING_VALUE = (char)205; 
const char NULL_VALUE = (char)0; 

IntPtr nameAddress = (IntPtr)myDLL.GetPointer(); 

// Only run if the pointer is not to a null value 
if (nameAddress != IntPtr.Zero) 
{ 
    byte[] nameAsBytes = new byte[BYTES_PER_DEVICE_NAME]; 
    Marshal.Copy(nameAddress, nameAsBytes, 0, BYTES_PER_DEVICE_NAME); 
    byte[] cleanedBytes = nameAsBytes.Where(a => a != PADDING_VALUE); //Filter out the bad bytes 
    string nameAsString = System.Text.Encoding.UTF8.GetString(cleanedBytes); 

    // Add the string to deviceNames, a string array 
    deviceNames[n] = nameAsString; 
} 
1

可以使用UTF8Encoding.GetString方法(Byte [],的Int32,Int32)方法:https://msdn.microsoft.com/en-us/library/kzb9f993(v=vs.110).aspx

byte[] nameAsBytes = new byte[BYTES_PER_DEVICE_NAME]; 
Marshal.Copy(nameAddress, nameAsBytes, 0, BYTES_PER_DEVICE_NAME); 
int strlen; 
for (strlen = 0; strlen < nameAsBytes.Length;strlen++) 
{ 
    if (nameAsBytes[strlen] == 0) 
    break; 
} 
string nameAsString = System.Text.Encoding.UTF8.GetString(nameAsBytes, 0, strlen); 
相關問題