2016-02-12 4 views
0

Я пытаюсь преобразовать String в байт [], а затем в IBuffer, чтобы установить поле HidOutputReport.Data.Byte []. AsBuffer() копирует результаты в Exception: значение не попадает в ожидаемый диапазон

Когда я пытаюсь использовать byte []. AsBuffer() VS2015 генерирует исключение ArgumentException и предоставляет «Значение не входит в ожидаемый диапазон» в качестве дополнительной информации об исключении.

Если я пытаюсь использовать DataWriter, то такое же исключение вызывается при вызове DataWriter.DetachBuffer().

Если у кого-то есть идеи, почему это может происходить или альтернативные методы, я мог бы попытаться получить мою строку в IBuffer, это было бы весьма признательно.

EDIT: Код Добавлено

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 указывает тип отчета, который вы запрашиваете. Попробуйте установить свой первый байт в 0 в bytestoCopy и добавить содержимое текстового поля в виде байтов перед использованием 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.

С уважением

Гильерме Marques

 Смежные вопросы

  • Нет связанных вопросов^_^