Как разделить 16-битное значение на два 8-битных значения в VB.NET?

У меня есть 16-битное значение, подобное этому:

 0000000000000011

Я хочу разделить это на два 8-битных значения, например:

 00000000    and    00000011

16-разрядное значение представляет собой переменную byte_val1, представляющую собой 16-разрядное целое число без знака.

Как я могу сделать это в VB.NET?


person Arindam Das    schedule 27.02.2013    source источник
comment
вы смотрели на visualbasic.about.com/od/usingvbnet/a/bitops01. htm и stackoverflow .com/questions/1417645/ ?   -  person    schedule 27.02.2013
comment
на самом деле я пробовал операторы << >>, но не смог получить 00000011   -  person Arindam Das    schedule 27.02.2013
comment
только что использовал ›› или with с AND ? result = (val_16 >> 8) AND &HFF ? (&H -> 0x)   -  person    schedule 27.02.2013
comment
@Guffa решил это .. так что спасибо ему и всем спасибо за ваше время, ребята   -  person Arindam Das    schedule 27.02.2013


Ответы (3)


Вы можете использовать класс BitConverter:

Dim bytes As Byte() = BitConverter.GetBytes(byte_val1)

Теперь bytes(0) содержит младший байт (00000011), а bytes(1) содержит старший байт (00000000).

person Guffa    schedule 27.02.2013

Чтобы получить младшие 8 бит, нужно и с 11111111, или 0xff
Чтобы получить старшие 8 бит, нужно и с 1111111100000000, или 0xff00
Затем произвести арифметический сдвиг влево ровно на 8 бит.

Я давно не занимался Visual Basic, но идея такова:

word a = 1930392;
byte alower = a & 0xff;
byte ahigher = (a & 0xff00) >> 8;

О, вот код, который я сделал с тремя текстовыми полями с именами 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

Примечание: (localA And &HFF00) >> 8 эквивалентно (localA >> 8) And &HFF

person Dmitry    schedule 27.02.2013
comment
Технически операция И не требуется перед выполнением битового сдвига. - person Steven Doggart; 27.02.2013
comment
(localA и &HFF00) ›› 8; обязательно так. В противном случае мне нужно было бы написать ((localA ›› 8) И &HFF), если хотите, можете сами нарисовать картинку, это не так уж сложно. 0xff00 и 0x00ff не равны - person Dmitry; 28.02.2013
comment
Сдвиг битов в VB.NET не является циклическим, поэтому, когда вы сдвигаете 16-битное число на 8 бит вправо, 8 самых правых битов отбрасываются. Поэтому нет необходимости сначала обнулять их. Единственной причиной для этого было бы наличие большего числа, например, 32-битного целого числа. - person Steven Doggart; 28.02.2013

Простой битовый сдвиг должен работать, если вам нужны определенные байты из любого значения (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
person Community    schedule 27.02.2013