Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2015, 15:41   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Построить график с бинарными данными

Мне нужно, чтобы на графике было 1 0 1 0 1 0. Сейчас у меня 8 бит обозначается одним числом на графике. Как это исправить?
Код:
/////////////////Представляем символы в двоичном виде и выводим на график/////////////////
            //////////////////////////////////////////////////////////////////////////////////////////  
            string A = richTextBox1.Text;
            byte[] strBytes = System.Text.Encoding.Unicode.GetBytes(A);
            //string str = Encoding.ASCII.GetString(strBytes);

            StringBuilder sb = new StringBuilder();
            foreach (byte b in System.Text.Encoding.Unicode.GetBytes(A))
                sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')).Append(' ');

            string binaryStr = sb.ToString();                  //////////////Массив 0 и 1

            this.Controls["richTextBox2"].Text = binaryStr;
            ////////////////////////////////////////////////////////////////Создание значений x
            int l = strBytes.Length;                           
            int[] myArr = new int[l];
            // Инициализируем каждый элемент массива вручную
            for (int i = 0; i < l; i++)
            myArr[i] = i;

         
                chart1.Series["Series1"].Points.DataBindXY(myArr, strBytes);
Изображения
Тип файла: jpg Данные.jpg (61.3 Кб, 42 просмотров)
Krasi вне форума Ответить с цитированием
Старый 09.10.2015, 10:09   #2
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ок, как сформировать из массива byte такой массив, чтобы при выводе его на график были именно нули и единицы, а не представление 8-битных чисел в десятеричной системе счисления?
Krasi вне форума Ответить с цитированием
Старый 09.10.2015, 10:57   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Вопрос сводится всего лишь к тому, что в массиве byte каждое число задано с помощью 8 бит, то есть мой массив byte хранит 8-битные числа. Когда я вывожу на график byte[] mas; mas[1] = 00000100, то на графике получается число 4. Проблема в том, что у меня просто пока примитивное знание языка С в этом вопросе, помогите, пожалуйста, просто сделать так, чтобы это 8-битное число по очереди делилось на числа от 128 до 1, а затем значения сохранялись в новый массив, у которого длина в итоге будет в 8 раз больше. Вроде, подсильная задача любому программисту, дайте хоть некоторые комментарии по этому вопросу, а то сделать не получается, хотя вроде все понимаю и в том же матлабе спокойно делал с помощью цикла и операции arr = [arr newvalue]. Если нет более простых предложений, подскажите, как я могу в данном направлении решить поставленную мною задачу?
Krasi вне форума Ответить с цитированием
Старый 09.10.2015, 11:01   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Посмотри как битовый сдвиг делается и логическое И ну и само собой цикл над каждым байтом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.10.2015, 12:10   #5
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Посмотрел, а помогите разобраться? С помошью битового сдвига я могу сдвигать число на 1 знак все время. Например, имею 10010100. Я получаю 8 значений для каждого элемента массива типа byte:
Цитата:
10010100 00101000 01010000 10100000 01000000 10000000 00000000 00000000
Рассмотрим числа в десятичном формате:
Цитата:
148 74 37 18 9 4 2 1
Разряды:
Цитата:
128 40 80 160 64 128 0 0
Если число >= 128, то пишем 1, иначе - 0. Тогда в массив надо сначала записать хотя бы эти 8 бит, давайте начнем с этого.
Код:
//byte[] mas; mas[1] = 10010100;
 
int m3[]; int m2; byte m1 = mas[1];
for (i = 0; i<8; i++){
if (m1 >= "10000000")
    m2 = 1;
else m2 = 0;

byte m1 = m1 << 1;

m3 = m3 & m2;
}
Я пока боюсь это запускать и как-то находить в коде ошибки, потому что пишу вслепую, можно отсюда получить небольшую подсказку?=)

Я пытался причесать код, вот что с этого получилось, но выдает ошибку, что нельзя делать сдвиг для byte так, как я его делаю. Что не так?

Код:
int[] m3 = 0; int m2; byte m1 = strBytes[1];

            for (int i = 0; i < 8; i++)
            {
                if (m1 >= 128)
                    m2 = 1;
                else m2 = 0;

                m3[m3.Length+1] =  m2;
                m1 = m1 << 1;
            }
Все упирается в то, что строчка m1 = m1 << 1; не хочет работать для типа byte и жаждет int. Что делать?

Немного доработал, ошибки нет, но не могу понять, где в отладке можно посмотреть, что теперь из-себя представляет m3? На графике ерунда какая-то получается, хотя уже близко - на графике только 0 и 1. другое дело, что все 1 в начале графика, а все 0 - в конце. Я не понял=(

Код:
  int[] m3 = new int[100000]; int m2; int count = 0;
                for (int i = 0; i < strBytes.Length; i++)
                {
                    int m1 = Convert.ToInt32(strBytes[i]);
                    count = 0;

                    for (int ii = 0; ii < 8; ii++)
                    {
                        if (m1 >= 128)
                            m2 = 1;
                        else m2 = 0;

                        m3[count + 8 * i] = m2;
                        m1 = m1 << 1;
                        count = count++;
                    }
                }
А подскажите, как можно задать переменную int не 32 бит, а 8?

А если нельзя, то давайте пока отталкиваться от этого кода. Почему-то тоже некорректно конвертирует
Код:
int[] m3 = new int[100000]; int m2; int count = 0;
                for (int i = 0; i < strBytes.Length; i++)
                {
                    int m1 = Convert.ToInt32(strBytes[i]);
                    m1 = m1 << 24;
                    count = 0;

                    for (int ii = 0; ii < 8; ii++)
                    {
                        if (m1 < 0)
                            m2 = 1;
                        else m2 = 0;

                        m3[count + 8 * i] = m2;
                        m1 = m1 << 1;
                        count = count+1;
                    }
                }

Последний раз редактировалось Stilet; 09.10.2015 в 15:49.
Krasi вне форума Ответить с цитированием
Старый 09.10.2015, 15:56   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Могу я предложить такую схему?:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static string chr2(char c){
            string s=" ";
            for(;c!='\0';c=(char)((byte)c >> 1)) s=((((byte)c & 1) != 0)?"1":"0")+s;
            return s;
        }
        static string asbin(string s) { 
            string res="";
            foreach(char c in s) res+=chr2(c);
            return res;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(asbin("Hello")); Console.ReadKey();
        }
    }
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2015, 16:20   #7
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Да! Но я не понял, что она делает. Выполнил функцию asbin(), и у меня в окне вывелись 0 и 1. Но это string тип. Ну ок, но я думаю, что в строке я же все-равно должен получить что-то типа "0 1 0 1 1 0 0 1 1 0 0 0", а я получаю "010010 1000111" и тп. Я делаю что-то не так?

Давайте еще раз, потому что не могу, к сожалению, разобраться.
У меня есть сообщение "Hello", как и предложил Stillet. Изначально я хотел построить график, на котором будет бинарный сигнал, то есть функция y(t), где y принимает либо 0, либо 1. Теперь я понял, что мне вообще удобнее работать с бинарным массивом, то есть когда у меня есть, например, такой массив: int[] i = [1 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 ...], а не такой int[] i = [16 32 8 13 19 ...]. Ну задача же, наверное, банальная, где сложность? А Stillet, может Вы правильно подсказали, но я не понял, что код делает, потому что у меня вроде он запустился отлично, но я получаю строку, в которой нули и единицы, но они при конвертации так и преобразуются в 8-битные числа, а это как раз самый важный момент для меня - на график отправить бинарный массив, а не 8-ми битный. Я пользуюсь Вашей функцией так:
Код:
this.Controls["richTextBox2"].Text = asbin("Hello");
1. Кстати, могу добавить, что я разобрался немного с Вашим кодом и понял, как получить строку в таком виде: "1 0 0 1 1 1 0 0 0 1 1", а не в таком "100010 011101".
2. Я еще понял, что в С# если я сделаю int 32 = "1" или "0", то это будет нецелесообразно по затратам памяти, поэтому можете тут что-то предложить? Мне просто на следующем шаге нужно будет обрабатывать не по 8 бит информации и не по одному, но по 3.
3. А вот насчет графика - проблема серьезная для меня. То есть если я строю массив чисел, то он его выводит. Но тут я не знаю, как хотя бы строку "1 0 0 1 1 1 0 1" конвертировать в массив {1, 0, 0, 1, 1, 1, 0, 1}? Или как ее конвертировать таким образом, чтобы на графике построить эти бинарные значения по оси ординат?

Последний раз редактировалось Stilet; 12.10.2015 в 16:17.
Krasi вне форума Ответить с цитированием
Старый 12.10.2015, 16:20   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
то это будет нецелесообразно по затратам памяти
Ого! Ты знаешь что нужно компьютеру лучше самого компьютера? Я поражен твоей светлой стороной силы )
Цитата:
не по 8 бит информации и не по одному, но по 3.
И как сие понимать?
Цитата:
как хотя бы строку "1 0 0 1 1 1 0 1" конвертировать в массив
(byte)c & 1 дает очередную 0 или 1. Смекаешь? Его в массив и пиши. а лучше тогда уж стразу в график выводи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.10.2015, 16:46   #9
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Насчет затрат памяти - компьютер будет использовать 32 бита для хранения 1 бита, и я тут задумался, нормально ли это.
Обрабатывать не по 8 бит информации, а по 3 - я решаю радиотехническую задачу, то есть мне надо модулировать данные 8-PSK модуляцией, поэтому каждые 3 бита информации я буду преобразовывать в другое число. А я привык работать с массивом бит в МАТЛАБ, поэтому тут я только сейчас сообразил, что это не прокатит, потому что массива переменных размерностью в 1 бит я сформировать не смогу. Или я ошибаюсь?

Насчет (byte)c & 1 понятно, здорово!
Но появился вопрос насчет вывода в график, как можно запихать строчку
Код:
this.Controls.Add(zedGraph);
в функцию static string chr2(char c) ?
Компилятор пишет, что внутри функции он не знает, что такое this.
Krasi вне форума Ответить с цитированием
Старый 12.10.2015, 17:41   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
компьютер будет использовать 32 бита для хранения 1 бита, и я тут задумался, нормально ли это.
У компьютера нет выхода. Компьютер никогда не может использовать всего лишь один бит, он будет все равно выравнивать до своей разрядности.
Короче ты из пальца проблему рождаешь.
Цитата:
потому что массива переменных размерностью в 1 бит я сформировать не смогу. Или я ошибаюсь?
Вообще то ошибаешься )
https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx
Цитата:
внутри функции он не знает, что такое this.
Ой ой... А ты чего серьезно мой пример скопипастил даже не разобравшись?
Это же просто подача идеи, разве можно так и с идеями поступать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести byte в текстовую строку бинарными данными Krasi Помощь студентам 1 08.10.2015 15:42
Как построить граф,имея таблицу с данными? Вероника99 Помощь студентам 0 06.12.2014 20:38
Построить График МакаРомка! Паскаль, Turbo Pascal, PascalABC.NET 0 02.06.2013 11:17
Работа с бинарными данными. Lestar C# (си шарп) 0 04.11.2012 22:35
Работа с бинарными данными MyXa Общие вопросы .NET 1 31.01.2012 07:50