2013-02-27 138 views
2

我有一个16位的值是这样的:如何在VB.NET中将16位值分成两个8位值?

0000000000000011 

我想在两个8位值拆分此类似:

00000000 and 00000011 

16位值是一个变量,byte_val1,这是一个无符号的16位整数。

如何在VB.NET中做到这一点?

+0

有你看着http://visualbasic.about.com/od/usingvbnet/a/bitops01.htm和http://stackoverflow.com/questions/1417645/how-to-bitwise-shift-in-vb-net? – 2013-02-27 11:15:57

+0

其实我试过''<< >>'运营商,但没有成功获得'00000011' – 2013-02-27 11:19:12

+0

确实只是用>>,或者用AND? 'result =(val_16 >> 8)AND&HFF'? (&H - > 0x) – 2013-02-27 11:27:27

回答

7

你可以使用BitConverter类:

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

现在bytes(0)含有低字节(00000011)和bytes(1)含有高字节(00000000)。

5

为了获得低8位,则需要和它与11111111,或0xff
为了获得高8位,则需要和它与1111111100000000,或0xff00
然后到算术左移正好是8比特。

我没有做过的Visual Basic在一段时间,但这个想法如下:

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

哦,这里是我与名为aaloweraupper三个文本框和一个按钮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被equivelent到(localA >> 8) And &HFF

+0

从技术上讲,AND操作应该不必在进行位移之前。 – 2013-02-27 14:19:26

+0

(localA和&HFF00)>> 8;就像那样。否则,我需要写((localA >> 8)和&HFF),如果你喜欢,你可以画一幅自己的照片,这并不难。 0xff00和0x00ff不等于 – Dmitry 2013-02-27 20:31:42

+0

VB.NET中的位移不是循环的,所以当您将16位数字8位向右移位时,最右边的8位将被丢弃。因此,不需要先将它们清零。这样做的唯一原因是如果你有一个更大的数字,比如32位整数。 – 2013-02-28 00:44:09

2

如果你想从任何值(32位,64位,128位,等等)的某些字节(S),一个简单的位移应该工作。

最简单的方法是将AND(“binary 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 
相关问题