Чтобы проанализировать двоичный поток неуправляемых данных, мне нужно воссоздать типы данных.Данные сжимаются, что означает, что я читаю 2 байта, которые на самом деле представляют 6-битное byte
значение и 10-битное short
значение.
Все, что мне нужно сделать, это скопировать битовую последовательность из одногоценность для другого.Я знаю начальный бит и длину для исходного значения и конечного значения.До сих пор я сделал два подхода, которые оба копируют правильные биты, но как-то в обратном порядке.
byte BitwiseCopy(short value, int sourceStartBit, int destStartBit, int bitCount)
{
short result = 0;
for (int i = 0; i < bitCount; i++)
//result |= (byte) (value & (1 << sourceStartBit + i) | (result & (1 << (destStartBit + bitCount) - i)));
result |= (short) (value & (1 << sourceStartBit + i));
return (byte) (result >> ((destStartBit - bitCount) + sizeof(byte) * 8));
}
Для моего тестового сценария я использую короткое замыкание со следующим значением:
0000 0000 1101 0011
^15 ^0
Моя цель - скопировать 4-й - 7-й бит этой короткой строки в 0-3-й бит байта.
Когда я использую подход закомментированной строки (без кода в предложении возврата) или способ, которым она в настоящий момент выделена, я всегда получаю такой результат:
0000 1011
^7 ^0
Так что я хочу, просто наоборот.Я уверен, что это что-то крошечное, но что я здесь пропускаю?Я не понимаю, почему это меняет порядок.Подход со сдвигом битов (прямое копирование по битам и смещение его в правильную позицию) не должен его менять, не так ли?
EDIT : метод всегда имеетвход типа short
.У меня есть 3 параметра: sourceStart , который является битом, который я начинаю копировать из входного значения (от низкого до высокого), destStart , который является битом, который я копирую в мой пункт назначения (который являетсялибо байтовый, либо короткий - я бы сделал для этого два конкретных метода) и bitCount , то есть количество бит (начиная с младшего до старшего разряда), которое я хочу скопировать.
Метод должны копировать биты в правильном порядке.Так, например, CopyBitwise(input, 4, 0, 4)
должен вернуть (влево: высокий, правый: младший порядок) 0000 1011
с учетом этого ввода:
input [short]: ... 1011 0110
^8th ^0th
Еще один:
input [short]: 1011 0110 0100 0111
^15th ^0th
^end ^start
CopyBitwise(input, 7, 3, 5)
долженрезультат в
0011 0000
^8th ^0th
^end ^start