C# является ли файл gzip-архивом

Возникла задача работать с данными, которые могут быть сжаты в gzip-архив. Соответственно, необходимо было определить, является ли файл gzip-архивом. Это довольно просто, gzip-архив можно определить по сигнатуре 1f 8b 08 00. Проверку целостности оставим на функцию распаковки, и если вышеуказанная сигнатура обнаружена в начале файла, то будем считать, что перед нами архив gzip.
Вот функция проверки:

public bool IsGZip(string filename)
        {
            byte[] buf = null;
            try
            {
                buf = File.ReadAllBytes(filename);
            }
            catch
            {
                return false;
            }

            if (buf.Length < 4) return false;

            if ((buf[0] == 0x1F) && (buf[1] == 0x8B) &&
                (buf[2] == 0x08) && (buf[3] == 0x00))
                return true;

            return false;
        }

Если файл очень большой, то File.ReadAllBytes не подойдет. Надо будет через StreamReader или FileStream прочесть только первые 4 байта:

public bool IsGZip(string filename)
        {
            int signlen = 4;
            int count = 0;
            byte[] buf = new byte[signlen];
            FileStream readStream = null;
            try
            {
                readStream = new FileStream(filename, FileMode.Open);
                count = readStream.Read(buf, 0, signlen);
            }
            catch
            {
                return false;
            }
            readStream.Close();

            if (count < 4) return false;

            if ((buf[0] == 0x1F) && (buf[1] == 0x8B) &&
                (buf[2] == 0x08) && (buf[3] == 0x00))
                return true;

            return false;
        }

Код на PasteBin
Код на PasteBin (вариант 2)

Источник

C# Про конвертирование строки в Double (или любой другой тип с плавающей запятой)

Напоролся на тривиальный, но неприятный подводный камень. Функция Convert.ToDouble() по умолчанию смотрит на разделитель целой и дробной части, который указан в системных настройках. И если в строке разделитель другой, то генерирует exception, например, если конвертировать число 3.14, а в системных настройках в качестве разделителя указана не . (точка), а , (запятая), то программа вывалится с ошибкой.

Решение простое, с помощью второго параметра функции Convert.ToDouble() задать разделитель целой и дробной части. Вот пример функции-обертки над Convert.ToDouble(), с возможностью указания разделителя:

public static double ConvertToDouble(string Value, string DecimalSeparator)
        {
            NumberFormatInfo format = new NumberFormatInfo();
            format.NumberDecimalSeparator=DecimalSeparator;
            return Convert.ToDouble(Value, format);
        }

На самом деле, с помощью NumberFormatInfo можно задать еще кучу параметров, например, разделитель разрядов, буде такой понадобится.

Код на PasteBin

Источник

MSDN

C# Пример Charmap (таблицы символов) для различных кодировок.

Очередное студенческое задание, да. Причем опять, то ли препод не совсем адекватный, то ли студент, то ли мы дебилы и не видим чего-то лежащего на поверхности. Потому что «совсем для всех» кодировок, поддерживаемых .NET оно не получается.

Для начала, пришлось задачу все-таки глобально поделить на 3 больших части:
— кодировки однобайтовые (Windows 1251, DOS 866 и т.д.)
— кодировка Unicode
— кодировки многобайтовые, но не Unicode (всякие там японские, китайские и прочие).

Однобайтовые

С ними проще всего. Достаточно перебрать все символы от 0 до 255, перекодировать их последовательно в UTF-16 стандартной функцией класса Encoding и вывести на экран.

Encoding enc = Encoding.GetEncoding(CP);
for (int i = 0; i < 256; i++)
{
	string sChr = enc.GetString(new byte[] { (byte)i });
	//...
}

Отделить их от остальных тоже просто, у объекта Encoding есть свойство IsSingleByte

Unicode

С этим тоже особой сложности нет, весь стандарт открытый, можно взять список диапазонов Юникода прямо с официального сайта. Разобрать, залить в ComboBox и отображать кусками, для больших кусков сделать постраничное листание.

Главная проблема была побороть глюк с отображением символа с кодом > FFFFh Копия, из-за чего пришлось использовать RichTextBox и периодически пересчитывать ему размер в зависимости от используемого шрифта и символа, а также в нужных местах перерисовывать таблицу, чтоб та не расползалась.

Вторая проблема - изобрести какое-то подобие "композитных" шрифтов в BabelMap, т.е. подгружать разные шрифты для разных диапазонов Unicode, поскольку шрифта, абсолютно поддерживающего все символы Unicode нет, он бы получился чудовищно большим. И те, которые есть-то, не маленькие, из нескольких файлов, и весят под сотню мегабайт.

Чтоб ради задания не загадить систему шрифтами, пришлось предусмотреть возможность грузить их из файлов, а тут поджидал уже другой глюк, на этот раз Framework'а Копия.

В общем, процентов 90 кода (да и процессорного времени) уходит на возню со шрифтами и отрисовку таблицы.

Отделить варианты кодирования Unicode от других кодовых страниц тоже несложно, благо всего этих вариантов не так много (UTF16 LE/BE, UTF32 LE/BE, UTF8 и UTF7).

public static bool IsUnicode(int CodePage)
        {

            if (CodePage == 65001 ||
                CodePage == 65000 ||
                CodePage == 1201 ||
                CodePage == 1200 ||
                CodePage == 12000 ||
                CodePage == 12001)
                return true;
            else return false;            
        }


А получить конкретный символ можно вот таким способом:

if ((num >= 0x00d800) && (num <= 0x00dfff))
{
	st = Convert.ToString((char)num);
}
else
{
	st = char.ConvertFromUtf32(num); 
}


if ((num >= 0x00d800) && (num <= 0x00dfff)) - это чтобы не попасть в диапазоны суррогатов, но все-таки на их месте что-то отображать (в шрифтах там обычно пустые символы или знаки ?), а char.ConvertFromUtf32() при попадании в диапазон суррогатов свалится с ошибкой.

Остальные многобайтные кодировки

А вот тут уже так легко не получится, все-таки единственный вменяемый способ, это искать спецификации на каждую. Поэтому, в рамках задания, эта часть задачи была признана некорректной и не решаемой.

Нет, был, конечно, вариант простого перебора всех возможных вариантов. Максимальное количество байт, необходимых для кодирования символа в указанной кодировке можно получить с помощью Encoding.GetEncoding(cp).GetMaxByteCount(1), но перебрать все возможные значения, например, для массива размером уже в 4 байта, перебирая его, например, так, да еще и фильтруя все лишнее, непомерно долго.

В общем, вроде бы того, что сделали, оказалось достаточно.
Пришлось студенту писать пояснительную записку с источниками 🙂

Исходник примера на GitHub
Скачать

Leha S, NKT

C# Ошибка «Попытка чтения или записи в защищенную память» при работе со шрифтами из PrivateFontCollection

Понадобилось грузить TTF-шрифты из файлов, что делается с помощью PrivateFontCollection.AddFontFile(FileName). И, внезапно, стал проявляться плавающий глюк, возникающий, если периодически пересоздавать объект PrivateFontCollection. Например, при попытке сделать MeasureString(Text, LoadedFont).ToSize(), программа стала вываливаться с ошибкой "Попытка чтения или записи в защищенную память".

Пишут, что это глюк Framework’а и толковое решение только одно, создавать PrivateFontCollection один раз при запуске программы, например, в каком-нибудь статическом классе, и больше ее не трогать. Т.е. подгружать новые шрифты можно, а пересоздавать коллекцию не надо.
Минус решения — можно загадить память подгружаемыми шрифтами, если подгрузить много файлов. Но лучше пока ничего не нашел.

В принципе, можно создать вот такой статический класс, который будет подгружать шрифт в коллекцию, и хранить в Dictionary сопоставление между именем файла и шрифтом в коллекции. Если файл еще не был загружен — подгружать, если был, возвращать позицию в коллекции.

Ну и чтоб два раза не вставать, класс FileFont, который заодно меняет параметры шрифта (размер и начертание).

На Cyberforum’е тоже пока ничего более дельного не предложили.

C# Отображение суррогатной пары (символа с кодом >FFFF)

Известно, что внутренний формат строк в .NET — UTF16, что значит, что символы из основной многоязыковой плоскости (BMP) Unicode, т.е. с кодом меньше FFFF кодируются одним машинным словом, а остальные символы — двумя, одно из которых т.н. суррогат.

Так вот, как оказалось, с отображением суррогатных пар может возникнуть проблема. Контролы Windows Forms могут воспринимать символ с кодом >FFFF не как один символ, как должно быть, а как два. Для примера пробуем отобразить анатолийский иероглиф

с кодом 0x14476

Как видно, TextBox и Label воспринимают символ, как два символа, и, соответственно, его не отображают, а RichTextBox видит, что это один символ, но не отображает его, даже при правильно заданном шрифте.
MessageBox также отображает символ не как один, а как два:

Устранение проблемы с RichTextBox

Для устранения проблемы с RichTextBox достаточно задать нужный шрифт перед тем, как присвоить свойству Text нужные символы.

         int Code = 0x14476; //анатолийский иероглиф        
        Font AnFont = new Font("Anatolian", 24, FontStyle.Regular,
 GraphicsUnit.Pixel, 1);
        private void Form1_Load(object sender, EventArgs e)
        {
            string strSP = char.ConvertFromUtf32(Code);
            
            lblTest.Font = AnFont;
            txtTest.Font = AnFont;                        
            lblFont.Text = AnFont.FontFamily.Name;
            rtbTest.Font = AnFont;

            lblTest.Text = strSP;
            txtTest.Text = strSP;
            rtbTest.Text = strSP;
        }

PictureBox также отрисовывает нужный символ без проблем:

Корень проблемы

А корень проблемы кроется не в C#, .NET и компонентах Windows Forms, а в самой Windows. Пакет обновления SP1 для Windows 7 решает проблему полностью.

Наиболее универсальное решение

Наиболее универсальным решением является использование RichTextBox для работы с такими символами, во всяком случае, это работает даже для Windows XP, для которой ждать патчей, понятное дело, не приходится.
Главное, не забывать про то, что шрифт надо задавать до вставки/присвоения символа.

Обсуждение на Киберфоруме Копия

Пример
Пример на GitHub

C# Перевод чисел между системами счисления стандартной функцией класса Convert

Да, совсем забыл выложить исходник, спасибо, что напомнили.
Перевести число в/из десятичной в 2, 8, и 16-ричную систему можно с помощью стандартной функции класса Convert
Convert.ToInt64(s, From)
s — строка, содержащая число.
From — основание системы счисления.

Обратное преобразование:
Convert.ToString(n, To)
n — число
To — основание системы счисления.
На выходе будет строка

В примере еще показал, как ограничить ввод в текстовое поле, чтоб можно было вводить только определенные символы, и добавил отображение символа по его коду (в однобайтной кодировке, для Unicode будет погода на Марсе). Числа можно вводить через пробел.

Скачать исходник
Этот и другие примеры на Github

Colors. Утилита для подбора цвета фона и текста в Windows Forms

Опять студенты приходили, на этот раз с мелким заданием, перечислить все названия цветов в Windows Forms. Заодно уж сделал из этого задания утилитку, чтобы подбирать цвет символов на фоне в Windows Forms. Довел задание, так сказать, до логического конца. В общем, кто не успел сегодня на скайп-чатик, где я всякие мелочи объяснял и делал, ходите на Гитхаб, скачивайте там. Только не забудьте хоть что-нибудь переделать, а то преподы будут ругаться.

Принцип очень простой. Все названия цветов есть в перечислении KnownColor, а в классе Enum есть метод GetNames, который позволяет получить строковый массив с именами элементов перечисления.

string[] ColorNames = Enum.GetNames(typeof(KnownColor));

Вытащить конкретное значение элемента перечисления по его имени (если оно в виде строки) можно с помощью Enum.Parse

KnownColor knownColor =
                    (KnownColor)Enum.Parse(typeof(KnownColor), n);


n — строковая переменная с именем.

Все остальное стандартно, заполняем в цикле GridView и красим ячейки.

Ну и в довесок в программе есть пример использования ColorDialog и получение информации о выбранном в диалоге цвете.

И элемента управления TrackBar для выбора цвета и фона по RGB.

Пользуйтесь на здоровье.

Исходник:
На Гитхабе
На Mega.NZ
Cкомпилированная программка

ЗЫ. Спасибо, Леха, огромное за наводку на GitEve, и удобно, можно всё мышей тыкать, не набивать километры команд в консоли, и идет на всех ОС. Все-таки с этим вашим гитом через консоль несколько неудобно работать, или я пока еще не привык.

Подводный камень при чтении файла с помощью File.ReadAllText

Иногда проще прочитать файл, как текстовый в однобайтовой кодировке, чтобы что-нибудь там поделать с помощью стандартных string.Replace/string.Remove и т.д., иногда даже если файл не совсем текстовый, потому что таких же удобных функций для работы с массивом байт нет (или я не нашел).
Это, наверняка, адский быдлокод, но все-таки вполне альтернатива изобретению совсем уж дикого велосипеда.

А у меня речь шла о текстовых файлах, правда, неизвестно в какой кодировке, и символах, которые нужно искать/менять. Символы от кодировки не зависели, посему любой файл можно было рассматривать, как текстовый, в любой однобайтовой кодировке. Главное, в какой кодировке открыл, в той же потом и сохранить.
Так вот File.ReadAllText пытается автоматически определить кодировку файла на основе наличия меток порядка следования байтов и принудительная установка кодировки не помогает. Если в файле встретился зловредный BOM, то ReadAllText наплюет на твои указания кодировки с высокой колокольни и откроет в той, на которую ему BOM указывает, а при сохранении, соответственно, будет глюк и текст превратится в тыкву.

Беда, конечно, решается стандартно, чтением файла с помощью StreamReader и записью с помощью StreamWriter, которые себе такой самодеятельности не позволяют, но «осадочек остался».

Пример
Скачать

XuliOrganizzer. Простенький самописный органайзер на C#

Нет, оно не читается, как хули, органайзер. Но, может быть, что и подразумевается. 🙂
Это маленькая программа-органайзер для XP, 7, 8 и Vista. На 10 никто из нас ее запускать не пробовал, из за отсутствия таковой.

Что умеет:
— Собственно, напоминания по расписанию о событиях. Ну там кота покормить, или не забыть выключить самогонный аппарат, или продать славянский шкаф.

Возможны напоминания как в виде всплывающих подсказок в трее, так и в отдельном окне, повтор напоминаний через заданное время, звуковое оповещение.
Имеется возможность активировать/деактивировать задание-напоминание, есть контроль просроченных заданий и возможность немедленного выполнения таковых при старте программы.

— Запуск программ по расписанию, как с уведомлением, так и без.

— Симпатичный таймер обратного отсчета

— Текстовые заметки

Для заметок есть «корзина», т.е. случайно удаленную заметку можно восстановить.

Все данные хранятся в XML, в настройках можно посмотреть путь к файлу.

Писал в основном Леша, изредка виртуально пиная всех вокруг, и в основном для меня, потому что я давно хотел удовлетворяющий меня органайзер с напоминаниями, а в сети не было такого, который бы меня устраивал.

Распространяется свободно, как обычно, по лицензии Хекса.

Еще скриншоты

Скачать
Зеркало

Исходники:

Скачать
На Github

C#. Windows Forms. Режим замены текста по нажатию клавиши Insert в TextBox.

То есть, задача сделать, чтоб было как в нормальном текстовом редакторе, нажимаем Ins, и символы перед курсором заменяются на введенные с клавиатуры. Нажимаем еще раз и символы вставляются как обычно.
Элемент управления TextBox почему-то из коробки это не поддерживает, поддерживает MaskedTextBox, но и стандартный TextBox вполне можно допилить. Не знаю, почему на первых строках в поисковике какой-то ужас со StringBuilder‘ами и чуть ли не вызовом WINAPI, хотя все гораздо проще.

Заводим в форме логическую переменную, которая будет отвечать за то, какой режим ввода сейчас true — замена, false — обычная вставка.

bool InsertMode = false;

В обработчик события KeyUp помещаем код, который будет менять флаг, если был нажата клавиша Insert:

private void txtTest_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Insert)
            {
                InsertMode = !InsertMode;
            }

        }

В обработчике KeyPress код следующий

private void txtTest_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Вытаскиваю объект, который вызвал событие, 
            //чтоб можно было подключить несколько TextBox'ов
            TextBox tb = (TextBox)sender;
            
            //если включен соотв. режим, курсор не в конце текста
            //и не нажата какая-либо управляющая клавиша
            //заменим символ перед курсором
            if (InsertMode && tb.SelectionStart < tb.TextLength 
                && !Char.IsControl(e.KeyChar))
            {                                
                //выделяем 1 символ перед курсором
                //область выделения автоматически заменится 
                //символом, введенным  с клавиатуры
                tb.SelectionLength  = 1;

                //если выделен символ перевода строки, значит это конец строки 
                //в multiline TextBox,  
                if (tb.SelectedText == "\r" || tb.SelectedText == "\n")
                    tb.SelectionLength = 0; //не надо ничего
                                           //заменять, убираем выделение
            }
        }

Вот. Комментарев больше кода 🙂

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

Надо всего лишь модифицировать первое условие, чтоб исключить проверку на длину строки и добавить проверку на TextBox.MaxLength

if (InsertMode && !Char.IsControl(e.KeyChar))
{
	//замена по кругу
            if (tb.SelectionStart == tb.MaxLength) tb.SelectionStart = 0;
            //   [...]
}

Достигли последнего возможного символа, перескочили в начало текстового поля.

Пример 1 Пример 2
Скачать проекты

C# Windows Forms. Изменение размеров формы без заголовка

Форму с FormBorderStyle None можно сделать такую, чтобы пользователь мог менять и ее размеры мышью, как у обычной формы:
Код под катом
Получаются такие вот симпатичные формочки:


Код на PasteBin
Проект

C# Windows Forms. Перетаскивание формы без границ. Перетаскивание формы не за заголовок.

Т.е. такой формы, у которой FormBorderStyle установлен в None

Вариант 1, это прописать в обработчике MouseDown вот такой код:

base.Capture = false;
Message m = Message.Create(base.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);
this.WndProc(ref m);

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

Вариант №2 вот такой:
Код под катом

Форма также перетаскивается за любую точку формы, но, нужно несколько обработчиков событий, при перетаскивании форма будет перерисовываться вся, а не как обычно, когда появляется только рамка перетаскивания, и к тому же форма чуть-чуть дернется в начале перетаскивания, после нажатия левой кнопки мыши. Но если надо, чтоб во время перетаскивания она вся перерисовывалась, то вариант использовать второй способ.

Код раз Проект раз
Код два Проект два
Источник Копия

Понабежало студентов

Со своими заданиями на C#, заочники, ко всему прочему. И хрен бы с ним с уровнем знаний, кто-то умеет форму нарисовать сам, уже хорошо, кто-то знает, что такое форма (хотя бы для выпечки пирожных), кто-то умеет водить большой железный корабль и стрелять из… ну чем там корабЕль стреляет. У кого-то своя фирма по вебдезигну и наружной рекламе (такие обычно не приходят, им есть, кому на работе делать, или они сами умеют).

Страшнее студентов-заочников могут быть только преподаватели, которые им попадаются, и по закону подлости, самому, э-э-э… отстающему студенту, вот-вот, водителю корабЕля, достался самый въедливый препод. «Мало того, что говорящий, но и совсем непьющий препод, хрен знает с какой планеты», у которого ко всему прочему требование, чтоб все комментарии были на английском. Русофобия! Ну вот куда товарищ полковник… Правильно, товарищ полковник ему в прошлом году сам сдавал.

Первое задание было ничего, написать кодер/декодер из BASE64 и обратно. Ну вот как-то так

А второе, написать «менеджер паролей» с базой в XML, умеющий импортировать пароли и заметки к ним из произвольных текстовых файлов типа:

Иван Иванов
ivanov@example.org
13/01/1979
vatnik1931

Марья Иванова
ivanova@example.org
31/02/1989
vatnica1945

В общем, как-то сделал, но криво, точно знаю про то, что если где-то забыть галку в импорте, то функция импорта ничего не увидит, но есть кнопка предпросмотра перед добавлением в базу, так что галку можно поставить.

Кораблеводитель потерял исходники. Вот пусть они теперь тебе тут лежат на видном месте, чтоб по ночам не звонил.

Другие не вздумайте этим изделием пользоваться в целях всамделишного хранения настоящих паролей.

А вискарь, кстати, приехал поездом в косту из гламурманска, Леха его забрал и привез, но я пока не пробовал, меня покрысла грыза уличная и доктор пока запретил алкашку, как несовместимую с антибиотиками.

Перекодировщик в/из BASE64
Исходники типа «менеджера паролей»

C#. Генерация строки из случайных символов.

Задача

Сгенерировать строку, состоящую из случайных символов. Немного дополним задачу, строка будет состоять из случайных символов, а сами символы будут взяты из заранее заданного определенного набора. Например, строчные и заглавные латинские буквы, цифры, знаки препинания или любые другие заданные символы в любой комбинации.
Такая штуковина вполне может пригодиться для генерации, например, пароля из заданного набора символов

Решение

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

string GenRandomString(string Alphabet, int Length)
{
	...
}

Внутри функции.

//создаем объект Random, генерирующий случайные числа
Random rnd = new Random();
//объект StringBuilder с заранее заданным размером буфера под результирующую строку
StringBuilder sb = new StringBuilder(Length-1);
//переменную для хранения случайной позиции символа из строки Alphabet
int Position = 0;

Далее в цикле генерируем случайную строку:

for (int i = 0; i < Length; i++)
            {
                //получаем случайное число от 0 до последнего
                //символа в строке Alphabet
                Position = rnd.Next(0, Alphabet.Length-1);
                //добавляем выбранный символ в объект
                //StringBuilder
                sb.Append(Alphabet[Position]);                
            }

Возвращаем сгенерированную строку:

return sb.ToString();

Код функции на PasteBin

Пример использования функции

txtReturn.Text = GenRandomString("QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm", 10);

возвращает строку случайных символов длиной 10 знаков, состоящую из заглавных и строчных букв английского алфавита.

Немного об оптимизации

Более сложный способ мониторинга состояния сервера на Linux в реальном времени.

Продолжаю тему, начатую в предыдущей заметке [КОПИЯ]. В ней описывал получение данных от определенных скриптов и процессов запущенных на сервере под управлением Linux с помощью SSH, псевдотерминала и отдельного пользователя, создаваемого специально для целей мониторинга.

Будем посмотреть другой способ, с одной стороны, более сложный и требующий владения каким-нибудь языком программирования, кроме Bash-скриптов. Хотя, можно обойтись и исключительно одним Bash’ем, если клиент и сервер под Linux, или Bash прикрутили к Windows (cygwin(?), не пробовал, не знаю). А с другой стороны, наоборот, способ простой безопасный, требующий минимум вмешательства в настройки сервера.

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

Примечание: Термины «клиент» и «сервер» могут по ходу статьи быть неоднозначно истолкованными.
Серверное приложение будет наоборот, работать на «клиентском», «операторском» рабочем месте, а «сервер», в смысле компьютер с Linux, на котором я запускаю свои скрипты, и который управляет нужной мне железякой, станет вполне себе клиентом.
В общем, чтобы не вносить путаницы я условлюсь называть рабочее место оператора «локальным компьютером», а тот, который «сервер в привычном понимании» — «удаленным».

Задача

Такая же, как и в предыдущей заметке. Имеется удаленный компьютер под управлением Linux, рулящий системой контроля температуры и давления.
На самом деле, рулить он может чем угодно: от домашнего FTP с котиками или соединения с Интернетом, до управления СКД, открытием ворот, дверей, врат в Ад, личным концлагерем и т.д.
Суть в том, что нужно, чтобы удаленная система сигнализировала оператору об изменении своего состояния (изменении температуры, разрыва соединения с Интернетом, пришествии Сатаны). Оператор, как обычно, сидит под Windows (как в большинстве организаций в СНГ).

Некоторые соглашения

Для простоты условимся, что локальный и удаленный компьютер находятся в одной локальной сети (и одной подсети) 10.10.0.0/24, IP-адрес локального компьютера 10.10.0.30, прием данных производится через сетевой порт 11000 локального компьютера. Локальный и удаленный компьютеры обмениваются данными по протоколу TCP, данные представляют собой Unicode-строки.

Как это организовано на локальном и удаленном компьютере

Код

Сервера приема сообщений:
Смотреть на PasteBin
Скачать с Mega.nz

Скрипта отправки сообщений:
Смотреть на PasteBin
Скачать с Mega.nz

Источники

1. Клиент-серверное приложение на потоковом сокете TCP [Копия]
2. Как открыть TCP-/UDP-сокет средствами командной оболочки bash [Копия]

Видеоиллюстрация

Прямая ссылка

Ввод только цифр в текстовое поле

private void txtNumberField_KeyPress(object sender, KeyPressEventArgs e)
{
//ввод только цифр
if (!(Char.IsDigit(e.KeyChar)))
{
if (e.KeyChar != (char)Keys.Back)
{
e.Handled = true;
}
}
}

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/331372.html
Прокомментировать заметку можно по ссылке выше.

Пакетный конвертер текстов [Win 1251-Unicode UTF-8] и не только

Вот и первое мое быдлокодерское поделие, выкладываемое в публичный доступ.
В общем позвонил мне как-то Панкарь, и пожаловался на то, что пакетные перекодировщики все исключительно за бабло, а ему срочно надо, ибо движок сайта в виндовой кодировке, а надо в Юникоде. И бесплатная версия пакетного перекодировщика, как назло, перекодирует, добавляя BOM, что php-скриптам вредит, и они от слова совсем объявляют забастовку.
В общем решил я это дело подправить. И написать свой пакетный конвертер/перекодировщик текстов. Который и выношу на ваш суд и для бесплатного скачивания.
За дополнения, баги, замечания и т.д. буду благодарен.
Возможности:
— Пакетная перекодировка текстовых файлов
— Создание полного дерева каталогов для перекодированных файлов
— Доступен расширенный список кодировок (все кодировки, доступные объекту Encoding)
— Удаление BOM UTF-8
Скачать с mega.nz
Скачать с моего сайта
Исходники:
Скачать с mega.nz
Скачать с моего сайта
Скриншоты:
На моем сайте
На imgur.com

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/326984.html
Прокомментировать заметку можно по ссылке выше.

INI PARSER, класс для работы с INI-файлами

Без API, все реализовано средствами C#
Подойдет для хранения конфига небольшой программы, для которой XML-когнфиг излишество и не надо совсем.
класс для работы с INI-файлами

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/326786.html
Прокомментировать заметку можно по ссылке выше.

Проверка валидности введенного IP-адреса (V4)

Без использования регулярных выражений.
Пишет мне один старый товарищ, ныне студент, и просит регулярку для проверки валидности IP. Как выяснилось, регулярка оказалась не нужна совсем, т.к. задача поиска IP в тексте неизвестной структуры не стояла. А что такое IP? Да это же просто 4 байта, разделенных точкой. Посему достаточно просто разложить строку на составляющие функцией split(), проверить, сколько строк получилось в результате, и если строк 4 — попытаться каждую сконвертировать в байт. Если все сконвертировались — IP правильный.
bool isValidIP(string IPAddress)
{
     char[] ch = new char[1]; //Разделители для функции split
     ch[0] = '.'; //у нас 1 - точка
     string[] IPArr = IPAddress.Split(ch); //разделяем строку на составляющие и записываем в массив
     if (IPArr.Length != 4) return false; //если длина не 4 ровно, значит точно не IP
          byte b = 0; //временная переменная для результата конверсии
          bool res = false;//временная переменная флага, прошла ли конверсия удачно
          for (int i = 0; i < 4; i++) //прогоняем все элементы массива через конверсию           {                res = byte.TryParse(IPArr[i], out b); //пытаемся сконвертировать                if (!res) return false; //если функция вернула false, значит элемент массива не байт. Возвращаем false           }      return true; //если до этого нигде не вывалились, это IP, возвращаем true }

Вариант проверки с использованием класса Convert и обработкой исключений:
Read more...
Вариант 1 на pastebin
Вариант 2 на pastebin
демо
static class с функциями отдельно

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/291094.html
Прокомментировать заметку можно по ссылке выше.

Класс для работы с диапазонами чисел.

Точнее, написать надо было класс, который сможет проанализировать строку, где через запятую перечислены числовые значения, как одиночные, так и заданные отрезками: НачальноеЧислоКонечноеЧисло.
НачальноеЧисло должно быть меньше КонечноеЧисло.
Например: 1, 114, 21-30. И в дальнейшем показать, входит ли заданное значение в ранее установленный диапазон. Но заодно уж добавил и остальные функции. Строки такие, например, встречаются в окне печати Word (номера страниц)
Свойства класса:
bool AllowRepeats — В случае истинности значения AllowRepeats в диапазоне разрешены повторы значений.
2 конструктора — 1 создает класс с AllowRepeats==true, 2 позволяет задать AllowRepeats
Методы:
AddInDiapason (long Value) — Добавляет в диапазон значение Value
AddInDiapason(long StartValue, long EndValue) — Добавляет в диапазон значения, начиная со StartValue и заканчивая EndValue включительно
AddFromString(string DiapasonString) — добавляет в диапазон значения из вышеописанной строки, если не получилось возвращает false.
Clear() — Очищает значения диапазона
InDiapasonCount(long Value) — Возвращает, сколько раз встречается значение Value в диапазоне.
SortDiapason(SortOrder Order) — Сортирует диапазон по возрастанию или убыванию в зависимости от заданного параметра Order
SortOrder описана как:

public enum SortOrder
{
byAscending = 0,
byDescending = 1
}


ToArray() — Возвращает массив, содержащий значения диапазона.
InDiapason(long Value) — Проверяет, входит ли значение Value в диапазон (возвращает true или false)
GetIndexes(long Value) — Получает индексы элементов, равных значению Value
RemoveAt(int Index) — Удаляет элемент с индексом Index, генерирует исключение если индекс вне диапазона.
Remove(long Value) — Удаляет из диапазона все значения Value
Remove(long StartValue, long EndValue) — Удаляет из диапазона все значения, начиная со StartValue и заканчивая EndValue
RemoveInDiapason(string DiapasonString) — Удаляет из диапазона все значения, заданные строкой DiapasonString
GetValue(int Index) — Возвращает значение элемента с индексом Index
SetValue(int Index, long Value) — Устанавливает элементу с индексом Index значение Value
ReplaceValue(long OldValue, long NewValue) — Заменяет в диапазоне значения равные OldValue на значения NewValue
MaxValue(out long Value) — Возвращает максимальное значение элемента диапазона в переменную Value. Возвращает false в случае, если диапазон не заполнен значениями.
MinValue(out long Value) — Возвращает минимальное значение элемента диапазона в переменную Value. Возвращает false в случае, если диапазон не заполнен значениями.
Скачать исходник класса
Скачать демо

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/192739.html
Прокомментировать заметку можно по ссылке выше.