2017-02-06 24 views
0

我有3个数字,我试图把它们打包成一个字节(0-255)。按位打包多个数字到一个字节

Dim num0 As Integer = 6 
Dim Num1 As Integer = 17 
Dim Num2 As Integer = 30 

Dim Packed As Integer = (num0 And &HFFFF) << 1 Or (Num1 And &HFFFF) << 16 Or Num2 And &HFFFF 

Dim GotNum0 = (Packed >> 1) And &HFFFF 
Dim GotNum1 = (Packed >> 16) And &HFFFF 
Dim GotNum2 = Packed And &HFFFF 

但输出是10,16,20

谁能帮助。

+4

是的,该代码是非常错误的。基本问题,Num0需要至少3位,Num1需要5位,Num3需要5位。 3 + 5 + 5位不适合8位字节。很不清楚你打算如何解决根本问题。那么,不要这样做,使用一个结构。 –

+0

是的,我同意。谢谢, – dave88

回答

-1

您不能将这3个数字打包到一个字节中,您可以使用整数中的3个字节打包它们。用一个掩码从Packed中选择一个字节用于你的每个数字(最大值为255)。然后转换Packed回:

Dim num0 As Integer = 6 
Dim Num1 As Integer = 17 
Dim Num2 As Integer = 30 

Dim Packed As Integer = (num0 And &HFF) Or ((Num1 << 8) And &HFF00) Or ((Num2 << 16) And &HFF0000) 

Dim GotNum0 = Packed And &HFF 
Dim GotNum1 = (Packed And &HFF00) >> 8 
Dim GotNum2 = (Packed And &HFF0000) >> 16 
+0

这个代码不包含字节,它用nybbles(半个字节,即4位)打包,最大值为15(不是255)。但是Num1和Num2的移位操作会将它们的值移到相应掩码的外部,因此在这些操作GotNum1和GotNum2都将具有零值之后。将移位操作更改为4位和8位将对齐nybble打包操作,但由于最大值可打包值为15,因此仍将截断数据;在这种情况下,GotNum1的值为1(不是17),GotNum2的值为14(不是30)。 – MarkL

+0

你是对的,修正了谢谢 – salvolds

+0

虽然编辑代码纠正了在其中发现的问题,但这个答案没有(也没有最初)解决OP问题,该问题将值打包为_single byte_。正如汉斯在他对原文的评论中指出的那样,考虑到问题的措词,这是不可能的。 – MarkL