Рейтинг:
2
Jochen Arndt
Для первого блока кода размер IsoMessageForProcessing
массив должен быть не менее IsoMessageReceived.Length + 2
. Вы не показали код, в котором массив определен / размерен. Но он недостаточно велик, потому что вы получаете ошибку.
Аналогично для второго случая: Input
массив должен быть как минимум одного размера Length + 2
Предполагая, что это буфер массива байтов и поскольку длина вычисляется из первых двух байтов, он должен иметь размер 0x10002, чтобы избежать каких-либо ошибок вне границ.
Member 10230348
может у PLZ помочь мне устранить эту ошибку
Jochen Arndt
Извините, я не могу, потому что вы не показали достаточно кода, например, где и как устанавливаются размеры массива и что в конечном итоге должен делать код.
Общее правило:
Элементы массива могут быть доступны с индексами от нуля до размера - 1. Любой другой индекс выдаст ошибку out of bound.
Member 10230348
int Length = конвертировать.ToInt32(Input[0]) * 256 + Преобразование.ToInt32(Input[1]); // длина равна 12336, а вход-165
byte[] ResultBytes = новый байт[длина];
string ResultOutput = строка.Пустой;
for (int i = 0; i < Length; i++)
{
ResultBytes[i] = Input[i + 2]; //Input[i + 2]
}
Jochen Arndt
Когда ваш входной массив имеет 165 байт, вы можете получить доступ к элементам с индексом до 164. Индексы до 12336 явно слишком велики.
Но я не могу помочь, не зная, что такое вход и откуда берутся данные.
Member 10230348
публичная строка ConvertNFSByteArraytoFinIso8583(byte[] Input)
{
int Length = конвертировать.ToInt32(Input[0]) * 256 + Преобразование.ToInt32(Вход[1]);
byte[] ResultBytes = новый байт[длина];
string ResultOutput = строка.Пустой;
for (int i = 0; i < Input.Length; i++) //(int i = 0; i < Length; i++)
{
ResultBytes[i] = Input[i]; //Input[i + 2]
}
Длина = Результирующие Байты.Длина;
и где он должен получить 12336 может ли вы помочь мне в этом
Jochen Arndt
Каков размер входного сигнала (Input.Длина)?
Опять же: вы не можете получить доступ к элементам за пределами этого размера.
Каков тип данных, содержащихся во входных данных? Это какие-то протокольные данные?
Тогда какой протокол? Иначе, где определяется, что первые два байта содержат длину следующих данных?
Теперь вы понимаете, что у меня все еще не было необходимой информации, чтобы помочь?
Member 10230348
размер входного сигнала.длина 172 но я не знаю о int длина показывает мне 5 значный номер нет где он взят
Jochen Arndt
Снова:
Если реальный размер равен 172, то почему вы думаете, что длину можно определить по первым двум байтам? Это где-то определено?
Рейтинг:
1
OriginalGriff
Посмотрите на то, что вы делаете, пока ваша петля охранника подходит для ResultBytes
, там нет ничего, что говорит о том, насколько велик Input
массив есть. Если он недостаточно длинный, чтобы справиться с длиной + 2, вы получите это исключение, когда будете убегать от конца массива.
Я бы посоветовал вам посмотреть на входные данные и откуда они берутся: поскольку это байты, я бы предположил, что вы используете SerialPort и еще не получили всего сообщения...
Member 10230348
входной массив не удовлетворяет условию он выдает мне ошибку plz help
OriginalGriff
Это нам ни о чем не говорит - Перестаньте пытаться печатать как можно меньше и дайте нам актуальную информацию.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Member 10230348
IsoMessageReceived = streamReader.ReadBytes(конвертировать.ToInt32((FirstLetter * 256) + NextChars));
IsoMessageForProcessing = новый байт[IsoMessageReceived.Длина + 2];
IsoMessageForProcessing[0] = Конвертировать.Тобайт(Первая Буква);
IsoMessageForProcessing[1] = Конвертировать.Тобайт(NextChars);
for (int i = 0; i < IsoMessageReceived.Длина; i++) //[IsoMessageReceived.Длина : 172]
{
IsoMessageForProcessing[i + 2] = IsoMessageReceived[i];
//[IsoMessageReceived :{байт[172]]
}
Temp = ConvertNFSByteArraytoFinIso8583(IsoMessageForProcessing); //IsoMessageForProcessing {byte[174]}
OriginalGriff
Итак, у меня есть кусок кода.
Итак, что он делает такого, чего вы не ожидали, или не делает того, что вы сделали?
Как это соотносится с другим кодом?
Помните, я не могу запустить ваш код: у меня нет того, к чему подключен поток!
Member 10230348
это мой код я получаю значение в firstletter и nextchars когда цикл запускается он удовлетворяется условием добавляя еще 2 значения в этом
Member 10230348
моя длина составляет 172 но петли выходят на 174 как прийти на эту помощь плз
Рейтинг:
0
Kornfeld Eliyahu Peter
Вы работаете на i
, но используя i + 2
тоже...
Давайте представим, что у вас есть 5 членов, в этом случае у вас будут эти индексы...
i -> 0 1 2 3 4
i + 2 -> 2 3 4 5 6
5 и 6-это индексы, которые выходят за пределы границы!!!
Member 10230348
так что же мне делать с этим кодом
OriginalGriff
*кашель* другой массив *кашель*
Member 10230348
IsoMessageReceived = streamReader.ReadBytes(конвертировать.ToInt32((FirstLetter * 256) + NextChars));
IsoMessageForProcessing = новый байт[IsoMessageReceived.Длина + 2];
IsoMessageForProcessing[0] = Конвертировать.Тобайт(Первая Буква);
IsoMessageForProcessing[1] = Конвертировать.Тобайт(NextChars);
for (int i = 0; i < IsoMessageReceived.Длина; i++) //[IsoMessageReceived.Длина : 172]
{
IsoMessageForProcessing[i + 2] = IsoMessageReceived[i];
//[IsoMessageReceived :{байт[172]]
}
Temp = ConvertNFSByteArraytoFinIso8583(IsoMessageForProcessing); //IsoMessageForProcessing {byte[174]}
Member 10230348
моя длина составляет 172 но петли выходят на 174 как прийти на эту помощь плз