Member 10230348 Ответов: 3

Это мой код plz помогите мне я новичок в этом


1).
for (int i = 0; i < IsoMessageReceived.Length; i++)
{
  IsoMessageForProcessing[i + 2] = IsoMessageReceived[i];
}

2).
int Length = Convert.ToInt32(Input[0]) * 256 + Convert.ToInt32(Input[1]);

byte[] ResultBytes = new byte[Length];
string ResultOutput = string.Empty;

for (int i = 0; i < Length; i++)
{
  ResultBytes[i] = Input[i + 2];        //Input[i + 2]
}

Вышеприведенные 2 кода выдают ошибку

Это ошибка : индекс находился за пределами массива

Что я уже пробовал:

я отлаживаю этот код, но выбрасываю ошибку

F-ES Sitecore

Вы получаете это, когда число в скобках относится к элементу вне размера массива

Если "x" - это массив строк длиной 3

x[0] = "a"
x[1] = "b"
x[2] = "c"

Если вы ссылаетесь на что-либо, кроме x[0], x[1] или x[2], вы получите эту ошибку

строка y = x[3]

Поэтому посмотрите на длину массивов, к которым вы обращаетесь, посмотрите на индексы, которые вы используете (числа в скобках), и попробуйте понять, почему вы обращаетесь к границам индекса. Мы не можем получить доступ к вашему коду или входным данным, поэтому мы не можем сделать это за вас.

Member 10230348

что я делаю плз посоветуйте что нибудь

johannesnestler

После прочтения решений и видя вашу борьбу за понимание ответов, которые вы получаете, я бы предложил: забудьте на некоторое время об этом коде и вернитесь к учебнику по C# и прочитайте 1 час о массивах и индексах. Это поможет вам больше, чем задавать вопросы об исключении, которое точно говорит вам, в чем заключается проблема. Индекс находился за пределами массива... Не бегайте перед тем, как идти - и кстати. научитесь использовать свой отладчик, чтобы увидеть, каков на самом деле размер вашего массива. Полезная ссылка: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/

CPallini

Вы должны опубликовать более подробную информацию о ваших массивах (например, InputИспользуйте отладчик, чтобы проверить их, а затем разместить здесь соответствующую информацию (например, значения Input[0] и Input[1] и фактическая длина Input массив).

3 Ответов

Рейтинг:
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 как прийти на эту помощь плз