2016-02-12 68 views
0

我試圖將一個字符串轉換爲一個字節[],然後到一個IBuffer中,以便設置我的HidOutputReport.Data字段。Byte []。AsBuffer()複製結果異常:值不在預期範圍內

當我嘗試使用byte []。AsBuffer()VS2015拋出一個ArgumentException並提供「值不在預期範圍內」作爲有關異常的附加信息。

如果我嘗試使用DataWriter,則在調用DataWriter.DetachBuffer()時會引發同樣的異常。

如果任何人有任何想法,爲什麼這可能會發生或替代方法,我可以嘗試讓我的字符串變成一個IBuffer它將不勝感激。

編輯:代碼添加

HidOutputReport outputReport = device.CreateOutputReport(); 

byte[] bytesToCopy = new byte[textBox.Text.Length]; 
bytesToCopy = System.Text.Encoding.ASCII.GetBytes(textBox.Text); 

//DataWriter dataWriter = new DataWriter(); 
//dataWriter.WriteBytes(bytesToCopy); 

outputReport.Data = bytesToCopy.AsBuffer(); 
//outputReport.Data = CryptographicBuffer.CreateFromByteArray(bytesToCopy); 

//WindowsRuntimeBufferExtensions.CopyTo(bytesToCopy, 0, outputReport.Data, 0, bytesToCopy.Length); 
uint bytesWritten = await proscannerSystem_device.SendOutputReportAsync(outputReport); 

你可以看到我的一些其他的方法,我試圖複製。值得注意的是WindowsRuntimeBufferExtensions.CopyTo()似乎工作,但我錯過了第一個字節(我試圖找出是否它是我的副本的問題,並讓我遇到這個問題,我傾向於相信它)。

+0

是否有可能爲你和你的代碼更新您的問題嗎? –

+0

嘿@RogerHartley我已經添加了一些代碼,但我不相信它會提供很多見解。 –

+0

我想知道是否編碼可能是問題 - 你使用ASCII編碼,但字符串是UT16。我不相信這是答案,因爲AsBuffer()只是圍繞一堆字節包裝一個IBuffer,並不關心這些字節是什麼。但是,這是一些嘗試 - 嘗試使用Encoding.Unicode.GetBytes(),看看它是否有任何區別。 –

回答

0

將outputreport.Data的長度與要複製的字節進行比較。 outputreport.data中的第一個字節表示您正在請求的報告的類型。嘗試在bytestoCopy中將第一個字節設置爲0,並在使用AsBuffer()之前將文本框內容添加爲字節。

0

首先,要了解問題,請打破發生異常的行。

HidOutputReport outputReport = device.CreateOutputReport(); 

byte[] bytesToCopy = new byte[textBox.Text.Length]; 
bytesToCopy = System.Text.Encoding.ASCII.GetBytes(textBox.Text); 

//I used a similiar one (equals the customHID sample) 
//DataWriter dataWriter = new DataWriter(); 
//dataWriter.WriteBytes(bytesToCopy); 

// This line is to show for you that the problem isn't the bytesToCopy but the your filling vector (Value does not fall within the expected range). 
var x=bytesToCopy.AsBuffer(); 

//Here, You take the bytes and put in report data. If outputReport.Data.Capacity was different of your bytesToCopy.Length the app throws a exception.* 
outputReport.Data = x; 

//outputReport.Data = CryptographicBuffer.CreateFromByteArray(bytesToCopy); 

//WindowsRuntimeBufferExtensions.CopyTo(bytesToCopy, 0, outputReport.Data, 0, bytesToCopy.Length); 
uint bytesWritten = await proscannerSystem_device.SendOutputReportAsync(outputReport); 

*我在當程序比較respectly的outputreport和dataWriter.DetachBuffer(之間的容量和長度的麻煩發生),它類似於您bytesToCopy拆卸列表檢查。

要解決此問題,請確保兩者均爲等於,否則填充向量或拋出異常以瞭解問題出在哪裏。

var x = bytesToCopy.AsBuffer(); 

if(outputReport.Data.Capacity != x.Length) 
{ throw new Exception("Buffer didn't work. Correct the ranger filling the vector x"); 
else{ 
outputReport.Data=x; 
} 
在我的情況,我沒有

...

DataWriter dataWriter = new DataWriter(); 
dataWriter.WriteByte(outputreport.Id); 
dataWriter.WriteString(bytes_vector); 
//IBuffer is 1(WriteByte) + bytes_vector.length 

//in my case the capacity is 65 => fill bytes_vector to 65 
for(int i=(bytes_vector.Length+1);i<outputReport.Data.Capacity;i++)   
{ 
dataWriter.WriteByte((Byte)0); 
} 

var x = dataWriter.DetachBuffer(); 
outputReport.Data=x; 

} 

不要忘記,第一個位置是outputreport.Id。

問候

吉列爾梅·馬奎斯

相關問題