Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:如何将字节的位向左旋转?_C#_Bit Manipulation_Bitwise Operators - Fatal编程技术网

C#:如何将字节的位向左旋转?

C#:如何将字节的位向左旋转?,c#,bit-manipulation,bitwise-operators,C#,Bit Manipulation,Bitwise Operators,我有一个包含0xE1和0x04的字节数组,我需要操纵它来生成0x104,我正在努力处理它。我被告知要做以下事情: 0xE1和0x1F=0x01 向左旋转8位=0x100 0x04添加0x100=0x104 制造商提供的原始说明: 0xE1大于0xE0 0xE1和0x1F=0x01 向左旋转8位=0x100 读取下一个字节=0x04 0x04添加0x100=0x104 我无法工作。我尝试了来自、方法和方法的扩展方法,但都没有成功获得0x100。我应该怎么做才能到达0x100 我以前从未做过位级

我有一个包含
0xE1
0x04
的字节数组,我需要操纵它来生成
0x104
,我正在努力处理它。我被告知要做以下事情:

  • 0xE1和0x1F=0x01
  • 向左旋转8位=0x100
  • 0x04添加0x100=0x104
  • 制造商提供的原始说明:

    • 0xE1大于0xE0
    • 0xE1和0x1F=0x01
    • 向左旋转8位=0x100
    • 读取下一个字节=0x04
    • 0x04添加0x100=0x104
    我无法工作。我尝试了来自、方法和方法的扩展方法,但都没有成功获得
    0x100
    。我应该怎么做才能到达
    0x100

    我以前从未做过位级操作,所以我一直在努力

    更新

    我正在分析GPS报告。报告中的字段大小为1或2字节。如果字节
    0
    的值小于
    0xE0
    ,则字段大小为1字节。否则,大小是2字节,我应该使用上面的步骤来获得实际值。引用文件:

    任何指定为1字节/2字节字段的字段都是使用以下编码的无符号整数: 如果第一个字节小于0xE0(十进制224),则字段大小为1字节,值为整个字节的值。如果第一个字节大于或等于0xE0,则字段大小为2字节,该值为2字节字段的lsb 13位的值(最高有效字节优先)

    以下是我正在使用的方法(LINQPad中的原型):

    下面是
    类型

    [Flags]
    public enum Type :
        short {
        General = 0x00,
        Versions = 0x104
    }
    

    字节step1=0xE1&0x1F//0x01
    
    short step2=step1
    0x100
    的结果不适合
    字节
    那么您使用的实际类型是什么?一个字节上8位的左旋转只会产生完全相同的值。请显示您尝试的确切代码,以便我们能够帮助查明问题。@juharr,我已经更新了问题,提供了有关我正在处理什么以及如何处理它的更多信息。该引文表示2字节字段的lsb 13位。我假设它应该是“last”而不是“lsb”?而且
    Type
    对于枚举来说是一个可怕的名称,因为它已经是类的名称了。这显然不是一组标志(这些标志的幂从0增加到2)。看起来你真的只需要常量值,而
    OneTwoField
    不需要是泛型的。这是文档所说的,所以我不能真正回答这个问题。我所要做的就是文档(在其他领域证明是错误的)和制造商提供的关于如何读取2个字节的说明(我现在也引用了它们)。命名现在还没有定论。我勉强路过时,不得不换了十几次。它可能应该是
    ItemType
    ,但正如我所说,这是一个原型。
    public struct OneTwoField<T> {
        public OneTwoField(
            byte size,
            T value) {
            Offset = size == 1 ? 0 : 1;
            Size = size;
            Value = value;
        }
    
        public int Offset { get; }
        public byte Size { get; }
        public T Value { get; }
    }
    
    [Flags]
    public enum Type :
        short {
        General = 0x00,
        Versions = 0x104
    }
    
    byte step1 = 0xE1 & 0x1F; //0x01
    short step2 = step1 << 8; //0x100