我有两个字节。我需要将它们变成两个整数,其中前12位构成一个int而后四个构成另一个。我认为我可以&&第二个字节用0x0f得到4位,但我不知道如何将它变成带有正确符号的字节。
更新: 只是为了澄清我有2个字节
byte1 = 0xab
byte2 = 0xcd
我需要用它来做这样的事情
var value = 0xabc * 10 ^ 0xd;
抱歉这令人困惑。
感谢所有帮助。
答案 0 :(得分:4)
int a = 10;
int a1 = a&0x000F;
int a2 = a&0xFFF0;
尝试使用此代码
答案 1 :(得分:4)
踢腿:
public static partial class Levitate
{
public static Tuple<int, int> UnPack(this int value)
{
uint sign = (uint)value & 0x80000000;
int small = ((int)sign >> 28) | (value & 0x0F);
int big = value & 0xFFF0;
return new Tuple<int, int>(small, big);
}
}
int a = 10;
a.UnPack();
答案 2 :(得分:3)
好的,让我们再试一次,知道我们要拍的是什么。我在VS2008中尝试了以下操作,它似乎工作正常,即最后outOne
和outTwo = -1
。这就是你要找的东西吗?
byte b1 = 0xff;
byte b2 = 0xff;
ushort total = (ushort)((b1 << 8) + b2);
short outOne = (short)((short)(total & 0xFFF0) >> 4);
sbyte outTwo = (sbyte)((sbyte)((total & 0xF) << 4) >> 4);
答案 3 :(得分:1)
假设您有以下字节:
byte a = 0xab;
byte b = 0xcd;
并考虑0xab前8位和0xcd后8位,或0xabc前12位和0xd后4位。然后你可以得到如下这些位;
int x = (a << 4) | (b >> 4); // x == 0x0abc
int y = b & 0x0f; // y == 0x000d
答案 4 :(得分:0)
编辑以考虑“签署”规则的澄清:
public void unpack( byte[] octets , out int hiNibbles , out int loNibble )
{
if ( octets == null ) throw new ArgumentNullException("octets");
if ( octets.Length != 2 ) throw new ArgumentException("octets") ;
int value = (int) BitConverter.ToInt16( octets , 0 ) ;
// since the value is signed, right shifts sign-extend
hiNibbles = value >> 4 ;
loNibble = ( value << 28 ) >> 28 ;
return ;
}