Рейтинг@Mail.ru

Как использовать тип BitVector32 в .NET

Опубликовано в Полезные советы

Если нужно оперировать отдельными битами и секциями битов в 32-разрядных числах, в .NET существует тип System.Collections.Specialized.BitVector32. Его использование сводится к тому, что сначала необходимо определить секции и/или маски. Маски используются для оперирования отдельными битами, а секции – для оперирования группами битов внутри числа.

Dim b0 As Integer = BitVector32.CreateMask() 'инициализация битовых масок - нулевой (младший) бит
Dim b1 As Integer = BitVector32.CreateMask(b0) '1-ый бит
Dim b2 As Integer = BitVector32.CreateMask(b1) '2-ой бит
            
Dim s0 As BitVector32.Section = BitVector32.CreateSection(1)   'бит 0
Dim s6_1 As BitVector32.Section = BitVector32.CreateSection(&B11_1111, s0)  'биты 1..6
Dim s8_7 As BitVector32.Section = BitVector32.CreateSection(&B11, s6_1)  'биты 7..8
Dim s9 As BitVector32.Section = BitVector32.CreateSection(1, s7_8)  'бит 9

Dim s1 As BitVector32.Section = BitVector32.CreateSection(1, s0) 'бит 1
Dim s9_2 As BitVector32.Section = BitVector32.CreateSection(&B1111_1111, s1) 'биты 2..9

Пример использования секций битов:

Dim vector As New BitVector32(&HFFFF) 'создаём 32-битный вектор и инициализируем числом 0xFFFF
vector(s6_1) = 26 'задаём значение для секции битов 1..6
vector(s9) = 1 'задаём значение для секции 9, т.е. 9-го разряда

Для управления отдельными битами:

vector(b0) = 0 'задаём значение "0" младшего (0-го) бита
vector(b1) = 1 'задаём значение "1" для 1-го бита

vector(s1) = 1 'то же, что и предыдущая строка, только доступ через секцию

Если вы присвоите секции значение, большее, чем определено количеством битов в секции, «лишние» биты будут отрезаны. Например, при попытке записать в секцию s6_1 число 92 (0101_1100), оно будет урезано до 6-ти бит, т.е. получится число 28 (01_1100).

В .NET также существует тип BitArray, обладающий похожей функциональностью. Разница в том, что размер числа не ограничен 32-мя разрядами, а отдельные биты представлены типом Boolean. Из-за этого он занимает больше места в памяти. И он не позволяет создавать секции: вам придётся оперировать каждым битом отдельно. Но у него большая гибкость при создании, имеется несколько перегруженных версий конструктора под разные нужды.

Подробнее ...

Потокобезопасная наблюдаемая коллекция

Опубликовано в Полезные советы

С версии .NET 4.5 можно определить глобальный объект блокировки:

Private ReadOnly LockObj As New Object()

И далее в коде перед использованием наблюдаемой коллекции указать этот объект как параметр статического метода EnableCollectionSynchronization():

BindingOperations.EnableCollectionSynchronization(MyObservableCollection, LockObj)
Подробнее ...

Распаковка файла из ресурсов в директорию приложения

Опубликовано в Полезные советы

Часто в приложении бывает необходимо использовать объёмные ресурсы, например, динамические библиотеки. Их можно включить в ресурсы приложения в сжатом виде. .NET имеет встроенный архиватор GZip. Его можно использовать, например, так:

''' 
''' Проверяет наличие необходимых DLL в текущей директории и при отсутствии создаёт.
''' 
Private Sub CheckDlls()
    Dim dlls As New Dictionary(Of String, Byte()) From {
        {"myLib1.dll", My.Resources.myLib1},
        {"myLib2.dll", My.Resources.myLib2}
    }
    For Each dll In dlls
        If (Not IO.File.Exists(dll.Key)) Then
            Using compressed As New IO.MemoryStream(dll.Value),
            gzStm As New IO.Compression.GZipStream(compressed, IO.Compression.CompressionMode.Decompress),
            decompressed As IO.FileStream = IO.File.Create(dll.Key)

                gzStm.CopyTo(decompressed)

            End Using
        End If
    Next

End Sub
Подробнее ...

Преобразовать Color в Brush в .NET

Опубликовано в Полезные советы

Как преобразовать в .NET Color в Brush? Просто:

Private Shared Function ColorToBrush(clr As System.Drawing.Color) As Brush
	Dim rgb As Integer = clr.ToArgb()
    Dim color = System.Windows.Media.Color.FromArgb(CByte(rgb >> 24 And &HFF), CByte(rgb >> 16 And &HFF), CByte(rgb >> 8 And &HFF), CByte(rgb And &HFF))
    Dim brsh As New SolidColorBrush(color) 
    Return brsh
End Function    
Подробнее ...

Как завершить консольное приложение .NET с заданным кодом

Опубликовано в Полезные советы

Чтобы вернуть при завершении консольного приложения числовой код с результатом выполнения приложения есть несколько способов:

  1. объявить метод Main() с возвращаемым типом Integer;
  2. при завершении программы вызвать метод Environment.Exit(code).

Код завершения, естественно, желательно сделать перечислением для удобства, если интересуют подробности более чем успешно/неуспешно.

Подробнее ...

Реализация интерфейса 1-Wire на микросхемах FTDI

Опубликовано в Программирование

С интерфейсом 1-Wire мы сталкиваемся ежедневно: он применяется для чтения ключей-«таблеток» от домофона. Микросхемы фирмы FTDI (FT2232, FT4232 и другие) не поддерживают реализацию интерфейса 1-Wire «из коробки». Но программно можно реализовать его самостоятельно. Чем и займёмся в статье.
Подробнее ...

Запрет выделения элементов ListBox / ListView (WPF)

Опубликовано в Полезные советы

Чтобы запретить выделение элементов элемента ListBox или ListView, можно определить это с помощью такого стиля:

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
         <Setter Property="Focusable" Value="False" />
    </Style>
</ListBox.ItemContainerStyle>

Второй вариант – использовать вместо ListBox элемент ItemsControl.

Подробнее ...
Подписаться на этот канал RSS