Вопрос:
У меня есть 16-битное значение, подобное этому:
0000000000000011
Я хочу разбить это на два 8-битных значения, например:
00000000 and 00000011
16-битовое значение представляет собой переменную byte_val1, которая представляет собой целое число без знака 16 бит.
Как это сделать в VB.NET?
Лучший ответ:
Вы можете использовать класс BitConverter:
Dim bytes As Byte() = BitConverter.GetBytes(byte_val1)
Теперь bytes(0) содержат младший байт (00000011), а bytes(1) содержат старший байт (00000000).
Ответ №1
Чтобы получить более низкие 8 бит, вам нужно и это с 11111111, или 0xff
Чтобы получить верхние 8 бит, вам нужно и это с 1111111100000000, или 0xff00
Затем к арифметическому сдвигу влево ровно 8 бит.
Я не делал Visual Basic в то время, но идея такова:
word a = 1930392; byte alower = a & 0xff; byte ahigher = (a & 0xff00) >> 8;
О, вот код, который я сделал с тремя текстовыми alower, называемыми a, alower, aupper и кнопкой btnDoIt:
Private Sub btnDoIt_Click(sender As Object, e As EventArgs) Handles btnDoIt.Click Dim localA = Integer.Parse(a.Text()) Dim localALower = localA And &HFF Dim localAUpper = (localA And &HFF00) >> 8 alower.Text = localALower aupper.Text = localAUpper End Sub
Sidenote: (localA And &HFF00) >> 8 равновероятно (localA >> 8) And &HFF
Ответ №2
Простой битвейт должен работать, если вы хотите, чтобы определенный байт из любого значения (32 бит, 64 бит, 128 бит и т.д.).
Самый простой способ – AND (“двоичный И”, также записанный как “&”) источник с нужными битами, а затем сдвигать его столько раз, сколько необходимо для получения желаемого значения.
Dim initial as Integer = &H123456 ‘ Hex: 0x123456 Dim result as Byte = (initial AND &H00FF00) >> 8 ‘result = 0x34
и если вы хотите присоединиться к ним снова, это еще проще:
Dim initial as Integer = &H123456 ‘ Hex: 0x123456 Dim result_a as Byte = (initial AND &H00FF00) >> 8 Dim result_b as Byte = (initial AND &HFF0000) >> 16 Dim final as Integer = (result_a << 8) or (result_b << 16) ‘final = 0x123400