Member 12669478 Ответов: 1

2D массив в байтовый массив


Я хочу сделать следующее:

1. извлеките информацию о продукте в виде сетки.
2. считывание данных из Gridview в 2D массив "целочисленного типа".
3. Конвертировать 2D массива байт[], или через буфер.Метод BlockCopy для того, чтобы передаваться по сети.
4. получите массив байтов.
5. Конвертировать его в 2D массив и заполнить таблицы.

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

<pre>
This is my code 

<pre>, var select = "SELECT Pro_ID, Price, Category_ID FROM Products where Empl_ID = 1";
                var c = new SqlConnection(); 
                var dataAdapter = new SqlDataAdapter(select, c);
    
                var commandBuilder = new SqlCommandBuilder(dataAdapter);
                var ds = new DataSet();
                dataAdapter.Fill(ds);
                dataGridView.DataSource = ds.Tables[0];
                dataGridView.Columns[0].HeaderText = "Items";
                dataGridView.Columns[1].HeaderText = "Price";
                dataGridView.Columns[2].HeaderText = "Quantity";
    
                // reading data from gridview into 2D array
                string[,] DataValue = new string[dataGridView.Rows.Count, dataGridView.Columns.Count];
    
                foreach (DataGridViewRow row in dataGridView.Rows)
                {
                    foreach (DataGridViewColumn col in dataGridView.Columns)
                    {
                        DataValue[row.Index, col.Index] = dataGridView.Rows[row.Index].Cells[col.Index].Value.ToString();
                    }
    
                }



Мне удалось реализовать первый и второй пункты, но в остальном мне нужны некоторые рекомендации для реализации.

Member 13036251

Вы должны убедиться, что кодировка одинакова для отправки и получения. Задумывались ли вы используете сессии переменную типа String[]. Вы можете сделать его многомерным и привязать к своей сетке.

1 Ответов

Рейтинг:
0

Mehedi Shams

Привет Member 12669478,

В основном то, что вы пытаетесь сделать, - это отправить значения сетки (2D-строку) по сети в виде байта[] и восстановить их в тот же 2D-массив. Вы рассматриваете все ценности как string.

Это может быть немного сложно, так как приемный конец должен знать размеры массива и метку для отдельных элементов в байтовом массиве. Я предлагаю вам использовать pipe ( | ) в качестве разделителя (я предполагаю, что в текстах нет трубы; наличие трубы в текстах крайне маловероятно).

После того как вы заселите DataValue вы можете добавить эти строки:

const int PIPEDELIMETER = 124;
List<byte> ListOfBytes = new List<byte>();

// Adding metadata - dimension of the first index. Plus the delimiter.
ListOfBytes.Add(Convert.ToByte(DataValue.GetUpperBound(0) + 1));
ListOfBytes.Add(PIPEDELIMETER);

// Adding metadata - dimension of the second index. Plus the delimiter.
ListOfBytes.Add(Convert.ToByte(DataValue.GetUpperBound(1) + 1));
ListOfBytes.Add(PIPEDELIMETER);

for (int i = 0; i <= DataValue.GetUpperBound(0); i++)
{
    for (int j = 0; j <= DataValue.GetUpperBound(1); j++)
    {
        // Add the string as bytes in ListOfBytes.
        ListOfBytes.AddRange(Encoding.ASCII.GetBytes(DataValue[i, j]));

        // Add the delimiter
        ListOfBytes.Add(PIPEDELIMETER);
    }
}

byte[] Bytes = ListOfBytes.ToArray();   // Convert 2D string array to byte array.
Скажи DataValue имеет размеры [3, 2], а первые два элемента:
DataValue[0, 0] = "Issac";
DataValue[0, 1] = "Newton";
Затем Bytes массив имеет следующую сигнатуру:
[0]: 3
[1]: 124
[2]: 2
[3]: 124
[4]: 73
[5]: 115
[6]: 115
[7]: 97
[8]: 99
[9]: 124
[10]: 78
[11]: 101
[12]: 119
[13]: 116
[14]: 111
[15]: 110
[16]: 124
.............
.............
Код на конце приемника выглядит следующим образом:
/*Reconstruction*/
int FirstDimensionCount = Bytes[0]; // First dimension from metadata.
int SecondDimensionCount = Bytes[2]; // Second dimension from metadata.

// String array to hold the reconstructed data.
string[,] DataValueConvertedBack = new string[FirstDimensionCount, SecondDimensionCount];
int BytesCount = 4; // Data starts from the 4-th index.

// Get the entire bytes array into character array.
char[] CharsFromBytes = Encoding.UTF8.GetString(Bytes).ToCharArray();

StringBuilder SBuilder = new StringBuilder();
for (int i = 0; i < FirstDimensionCount; i++)
{
    for (int j = 0; j < SecondDimensionCount; j++)
    {
        while (CharsFromBytes[BytesCount] != '|')
            SBuilder.Append(CharsFromBytes[BytesCount++]); // Build the string character by character.
        DataValueConvertedBack[i, j] = SBuilder.ToString(); // Add the string to the specified string array index.
        BytesCount++;   // Increase the bytes pointer as it is currently pointing to the pipe
        SBuilder.Clear();   // Clear out for the next operation.
    }
}

// DataValueConvertedBack (receiver end) = DataValue (sending end) at this point.