четверг, 16 августа 2012 г.

NET C# - byte[] to string, string to byte[]

Если мы работаем, например, с кодировкой ASCII, то для таких преобразований нам понадобится абстрактный класс Encoding расположенный в пространстве имен System.Text.

Пример 1:
byte[] helloWord = new byte[] { 72, 101, 108, 108, 111, 33 };
Console.WriteLine(Encoding.ASCII.GetString(helloWord)); // -> Привет

Пример 2:
string helloWord = "Hello!";
byte[] helloWordBytes = Encoding.ASCII.GetBytes(helloWord);
helloWordBytes.ToList().ForEach(n => Console.WriteLine(n)); // -> 72 101 108 108 111 33

Путаница с host файлом в 64-ех разрядной системе


В повседневной жизни довольно часто приходиться править hosts файл. И все мы прекрасно осведомлены, что его месторасположение всегда находилось, находится и будет находиться (возможно) по следующему пути %systemroot%\system32\drivers\etc. Все прекрасно если дело касается 32-ух битных систем. Но если у вас 64-ех битная система (Vista, Windows 7), то тут возникает одна проблема. Дело в том, что в %systemroot% существует две папки system32: System32 и SysWOW64. В какой же из них будет находится "нужный" нам hosts? Быть может их и вовсе два, и какой же нам нужен? На самом деле, hosts файл существует только в одном единственном экземпляре и находится он всегда в папке System32. Стоп, а как насчет SysWOW64? Ведь по логике это должка быть 64-ех битная версия изначальной System32? На самом то деле, именно в папке System32 и находятся 64-ех битные версии исполняемых файлов! Таким образом название папки не изменилось для 64-ех битных систем. Это сделано специально для обратной совместимости. И да, в SysWOW64 находятся 32-ух битные версии исполняемых файлов (при запуске 32-ух битных приложений WoW64 перенаправляет их в папку SysWOW64).

Итак мы разобрались где находится нужный нам hosts файл. Но как же его отредактировать? Дело в том, что я пользуюсь Total Commander'ом и в %systemroot%\system32\drivers я не могу найти папку etc в которой расположен hosts (даже при включенном показе скрытых файлов). Насколько я понял, это связано с тем что 32-ух битные версии программ не могут видеть 64-ех битных "товарищей". Для Total Commander'а это решается просто. В нижнюю строку вводим %Windir%\System32\drivers\etc и оказываемся в папке с нужным нам файлом. Если не хочется вводить путь можно вручную "дойти" до папки drivers и затем ввести "cd etc".

Чтобы hosts сразу отредактировать в notepad или notepad++: нажимаем CTRL-O, вводим уже знакомый нам путь %Windir%\System32\drivers\etc и открываем файл.

PS Обратите внимание, что  %systemroot% и %Windir% указывают на C:\Windows. Можно проверить через консоль.

воскресенье, 5 августа 2012 г.

.NET C# - Особенность модификатора readonly

Каждому известно, что инициализация readonly полей класса может осуществляться только при помощи инициализатора поля или же в конструкторе.
class Person
{
    private readonly int _age;

    public Person()
    {
        _age = 10;
    }
}
А что если нам надо провести инициализацию например в каком-нибудь методе класса и вызвать его из конструктора? Например так
class Person
{
    private readonly int _age;

    public Person()
    {
        Init();
    }

    private void Init()
    {
        _age = 10;
    }
}
Компилятор нам этого сделать не позволит. Выход из данной ситуации есть и состоит он в применении ref и out модификаторов.
class Person
{
    private readonly int _age;

    public Person()
    {
        Init(out _age);
    }

    // Применяем out но можно и ref
    private void Init(out int age)
    {
        age = 10;
    }

}
И это сработает! На этот раз компилятор ругаться не будет. Вот такой вот небольшой обходной путь при инициализации readonly полей из методов класса.

среда, 1 августа 2012 г.

Переменные среды в Windows

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