Необходимо преобразовать битовую маску в Python в VB.NET - PullRequest
0 голосов
/ 22 января 2020

У меня есть некоторый код Python 3, который извлекает информацию из массива байтов, используя маскирование, но мне нужно сделать это в программе VB. NET. Это Python.

modulation_indicies = ['Unknown','Normal','High','Low']
phs_noise = int.from_bytes(block_data[0x1E:0x20],byteorder='little')  & 0x01FFF
mod_index = modulation_indicies[(int.from_bytes(block_data[0x1E:0x20],byteorder='little')  & 0x0C000) >> 14]

, где block_data - это массив байтов. Моя система - маленький-индийский. Как это будет закодировано в VB. NET? Я пробовал несколько вещей на разных форумах, но не могу получить.

Ответы [ 3 ]

0 голосов
/ 23 января 2020

Хорошо, давайте добавим несколько слов, относящихся к нарезке.

block_data[0x1E:0x20]

- это типичное нарезание массива. Он возвращает фрагмент block_data из элемента 0x1E (14de c) в элемент 0x20-1 (15de c). Мы не знаем тип block_data, хотя я предполагаю, что это будут байты. Мы сделаем это в VB. net для любого типа массива.

Я написал расширение типа Array, называемое slice. В Visual Studio создайте новое решение для библиотеки. Следующее может быть скомпилировано в. net framework и. net core 3.1. Добавьте новый модуль следующим образом:

Imports System.Runtime.CompilerServices

Public Module SliceExtension

    <Extension()>
    Public Function Slice(Of T)(brr() As T, Optional inizio As Integer = 0, Optional fine As Integer = 0) As T()

        Dim Len As Integer = brr.Length
        Dim returnArray() As T = {}

        If inizio < 0 Then
            inizio = Len + inizio
            If fine = 0 Then
                fine = Len
            ElseIf fine < 0 Then
                fine = Len + fine
            End If
        Else
            inizio = idx(len:=Len, pos:=inizio)
            fine = idx(Len, fine, Len)
        End If


        Dim elemento As Integer = 0
        While (inizio < fine)
            Array.Resize(returnArray, returnArray.Length + 1)
            returnArray(elemento) = brr(inizio)
            elemento += 1
            inizio += 1
        End While

        Return returnArray

    End Function

    Public Function idx(ByVal len As Integer, pos As Integer, Optional termine As Integer = 0) As Integer

        If IsNothing(pos) Then
            pos = termine Or 0
        ElseIf (pos < 0) Then
            pos = Math.Max(len + pos, 0)
        ElseIf pos = 0 And termine < 0 Then
            pos = len
        Else
            pos = Math.Min(pos, len)
        End If
        Return pos

    End Function

End Module

Скомпилируйте. Это создаст dll в папке .bin пути проекта. В том же решении создайте настольное или консольное приложение для тестирования расширения. Добавить ссылку на недавно созданную DLL. Добавьте модуль и вставьте его следующим образом:

Imports SliceClass.SliceExtension
Module Program
    Sub Main()
        Dim arr() As String = {"10", "20", "30", "40", "50", "60", "70"}
        Dim retarr() As Object = arr.Slice(-3, -1)
        Console.WriteLine(retarr.ToString)
    End Sub
End Module

Использование: Array.Slice (начало, остановка). См. здесь для более подробного объяснения. Обратите внимание, что расширение не поддерживает шаг.

0 голосов
/ 24 января 2020

Исходя из ответов, код теперь:

Dim phs_noise As Int16
Dim mod_index As String
Dim ModulationIndicies = New String() {"U", "N", "H", "L"}
Dim PhaseNoise(1) As Byte
PhaseNoise(0) = Block_Data(12)
PhaseNoise(1) = Block_Data(11)
phs_noise = (BitConverter.ToInt16(PhaseNoise, 0) And &H1FFF) / 100
mod_index = ModulationIndicies(phs_noise And &HC000 >> 14)

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

0 голосов
/ 23 января 2020
Enum Modulation_indicies
    Unknown
    Normal
    High
    Low
End Enum

Sub Main()

    phs_noise = BitConverter.ToInt32(you_write_this, 0) And &H1FFF
    mod_index = Modulation_indicies(phs_noise And &HC000 >> 14)

End Sub
...