我有一个16位的值是这样的:如何在VB.NET中将16位值分成两个8位值?
0000000000000011
我想在两个8位值拆分此类似:
00000000 and 00000011
16位值是一个变量,byte_val1
,这是一个无符号的16位整数。
如何在VB.NET中做到这一点?
我有一个16位的值是这样的:如何在VB.NET中将16位值分成两个8位值?
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)。
为了获得低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
被equivelent到(localA >> 8) And &HFF
从技术上讲,AND操作应该不必在进行位移之前。 – 2013-02-27 14:19:26
(localA和&HFF00)>> 8;就像那样。否则,我需要写((localA >> 8)和&HFF),如果你喜欢,你可以画一幅自己的照片,这并不难。 0xff00和0x00ff不等于 – Dmitry 2013-02-27 20:31:42
VB.NET中的位移不是循环的,所以当您将16位数字8位向右移位时,最右边的8位将被丢弃。因此,不需要先将它们清零。这样做的唯一原因是如果你有一个更大的数字,比如32位整数。 – 2013-02-28 00:44:09
如果你想从任何值(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
有你看着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
其实我试过''<< >>'运营商,但没有成功获得'00000011' – 2013-02-27 11:19:12
确实只是用>>,或者用AND? 'result =(val_16 >> 8)AND&HFF'? (&H - > 0x) – 2013-02-27 11:27:27