【发布时间】:2015-05-31 02:22:11
【问题描述】:
我有一个字节数组,实际上是这样的二进制值
byte[] buf = new byte[] { 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
二进制表示为1111 1110(0xFF = 0, 0xF0= 1)。
需要从中构建的整数或字节的值是0xFE (254)。
我曾考虑将buf 转换为1s 和0s 的字符串,然后再转换为整数,但必须存在更优雅的方法来通过二进制操作完成此操作。
已知可以完美执行此操作的 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 值当前位置。
【问题讨论】:
-
看看BitConverter-class。
-
呃——你说 "二进制表示是 1111 1110 (FF = 0, F0= 1)" 这很令人困惑。你的意思是说:“二进制表示是 1111 1111 1111 1110(其中第一个和第二个字节已交换,因此 x'FF' 值为 position = 0,而 x'F0' 为位置 = 1)" ???
-
您是否要求人们为您编写代码?您的问题是什么?
-
是的,听起来确实令人困惑,但我正在与之通信的硬件通过串行端口将二进制数据返回给我,FF 表示 0,F0 表示 1,我必须将其转换为真正的二进制值首先,然后我可以使用 BitConverter 来解析它...
-
@EricLippert 我的问题是:我想有效地循环遍历我的原始数组,然后将真正的二进制 0 或 1 放入 Integer 或 byte 中,这取决于我是否有 F0 或 FF 值当前位置。
标签: c# binary integer-arithmetic