Как манипулировать битами двоичной строки в C # - PullRequest
1 голос
/ 26 октября 2019

Я работаю над c# desktop application. У меня есть немного строки, и я хочу toggle это.

c3 = DecimalToBinary(Convert.ToInt32(tbVal3.Text)).PadLeft(16, '0');
// above c3 is 0000001011110100

разбиение вышеупомянутой строки на две (подстрока)

string part1 = c3.Substring(0, 8); // 00000010

string part2 = c3.Substring(8, 8); // 11110100

Для part1 MSB первого октета должен быть установлен в 1 и для part2, таким образом, этот битдолжен быть сдвинут в младший бит первого октета, MSB второго (последнего) октета должен быть установлен в 0, таким образом, этот бит должен быть сдвинут в младший бит первого октета. Это дает двоичные значения part1 = 10000101 и part2 = 01110100

. Я проверил это решение Двоичный массив после операций переключения диапазона M , но, тем не менее, он не понятен.

Правило

in the case of the application context name LN referencing with no ciphering 
the arc labels of the object identifier are (2, 16, 756, 5, 8, 1, 1);
• the first octet of the encoding is the combination of the first two 
 numbers into a single number, following the rule of 
 40*First+Second -> 40*2 + 16 = 96 = 0x60;
• the third number of the Object Identifier (756) requires two octets: its 
hexadecimal value is 0x02F4, which is 00000010 11110100, but following the above rule, 
the MSB of the first octet shall be set to 1 and the MSB of the second (last) octet shall 
be set to 0, thus this bit shall be shifted into the LSB of the first octet. This gives 
binary 10000101 01110100, which is 0x8574;
• each remaining numbers of the Object Identifier required to be encoded on one octet;
• this results in the encoding 60 85 74 05 08 01 01.

Как выполнить это переключение с двоичными строками?

Любая помощь будет высоко оценена

1 Ответ

0 голосов
/ 26 октября 2019

Вы можете конвертировать строки в байты, чтобы иметь возможность манипулировать битами, а затем вы конвертируете значения в строки.

Таким образом, вы можете использовать это:

// Convert string of binary value (base 2) to byte
byte v1 = Convert.ToByte("00000010", 2);
byte v2 = Convert.ToByte("11110100", 2);

// Operate bits
v1 = (byte)( v1 | 0b10000000 );
v1 = (byte)( v1 | ( v2 & 0b10000000 ) >> 7 );
v2 = (byte)( v2 & ~0b10000000 );

// Convert to string formatted
string result1 = Convert.ToString(v1, 2).PadLeft(8, '0');
string result2 = Convert.ToString(v2, 2).PadLeft(8, '0');

Console.WriteLine(result1);
Console.WriteLine(result2);

Результат:

10000011
01110100

Вызывает MSB части 1.
Копирует MSB части 2 в LSB части 1.
Очищает MSB части 2.

Если вы не используетеC # 7, используйте 128 вместо 0b10000000.

Как вы и просили, если я понял, что вы просите. Но вы говорите: part1 = 10000101 и part2 = 01110100 ... поэтому я не понимаю, что вы написали, но, возможно, произошла ошибка, и вы хотели написать 10000011 вместо 10000101.

Если вы хотите переключать биты (0 => 1 и 1 => 0), используйте:

v1 = (byte)( v1 ^ 128);
v1 = (byte)( v1 | ( v2 & 128 ) >> 7 );
v2 = (byte)( v2 ^ 128 );

Он переключает MSB части 1.
Копирует MSB части 2в LSB части 1.
Переключает MSB части 2.

Битовые операторы

Битовые и сдвиговые операторы (C # ссылка)

Булева алгебра

...