У меня есть массив байтов, которые на самом деле являются двоичными значениями, подобными этому
byte[] buf = new byte[] { 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
Двоичное представление: 1111 1110
(0xFF
= 0
, 0xF0
= 1
).
Значение целого числа или байта, которое необходимо построить из этого, равно 0xFE
(254).
Я думал о преобразовании buf
в строку 1
s и 0
s, а затем обратно в целое число, но должны существовать более элегантные способы сделать это с помощью двоичных операций.
Код Pascal, который, как известно, делает это идеально (используя строку):
if NumberOfBytes > 0 then begin // there was a response
for c := Length(Str) downto 1 do begin
Ch := Str[c];
if (ord(ch) AND 2) = 0 then begin
Sin := Sin + '0';
end else begin
Sin := Sin + '1';
end;
INC(Teller);
if (Teller mod 8) = 0 then begin
N := BinaryStrToByte(Sin);
Edit2.Text := Edit2.Text + ByteHex(N) + ' ' ;
Sin := '';
end;
end;
Также код C, который, похоже, не переносится на C# из-за некоторых различий в поведении:
for(bytes = 0; bytes < len; bytes++)
{
newByte=0;
for(bits=0; bits<8; bits++)
{
newByte >>= 1;
if(inBuf[0]==0xff)
{
newByte |= 0x80;
}
}
pBuf[bytes]=newByte;
}
Я хочу эффективно перебрать свой исходный массив, а затем поместить настоящий двоичный файл 0
или 1
в int
или byte
, в зависимости от того, есть ли у меня значение 0xF0
или 0xFF
в текущей позиции.
0xFF = 1
и0xF0 = 0
? В противном случае ваш вопрос либо не имеет смысла, либо очень запутан. - person Will Vousden   schedule 30.05.2015