我转换为Short的二进制数据是否有效
本文关键字:数据 是否 有效 二进制 转换 Short | 更新日期: 2023-09-27 17:48:49
我正在读取一台设备生成的二进制日志文件。
我有一个字节[]中的数据。
如果我需要读取两个字节来创建一个短片,我可以这样做:
short value = (short)(byte[1] << 8);
value += byte[2];
现在我知道该值对于有效数据是正确的。
我怎么知道文件是否被搞砸了,比如说值FF FF在字节数组的这两个位置?
当我看到将FF FF转换为short的结果值时,我得到了-1。
这是FF FF的正常值吗?,还是电脑只是碰到了某种短路,然后用无效数据翻车?
就我的目的而言,所有这些数字都将是正的。如果FF FF实际上是一个短-1,那么我只需要验证我的所有结果都是正的。
谢谢,
Keith
BTW,我也在阅读其他数字数据类型。我会带他们来这里只是因为。Read函数是读取字节[]的基本部分。所有其他数据类型的读取都使用基本的Read()函数
public byte Read()
{
//advance position and then return byte at position
byte returnValue;
if (_CurrentPosition < _count - 1)
{
returnValue= _array[_offset + ++_CurrentPosition];
return returnValue;
}
else
throw new System.IO.EndOfStreamException
("Cannot Read Array, at end of stream.");
}
public float ReadFloat()
{
byte[] floatTemp = new byte[4];
for (int i = 3; i >= 0; i--)
{
floatTemp[i] = Read();
}
float returnValue = System.BitConverter.ToSingle
(floatTemp, 0);
if (float.IsNaN(returnValue))
{
throw new Execption("Not a Number");
}
return returnValue;
}
public short ReadInt16()
{
short returnValue = (short)(Read() << 8);
returnValue += Read();
return returnValue;
}
public int ReadInt32()
{
int returnValue = Read() << 24;
returnValue += Read() << 16;
returnValue += Read() << 8;
returnValue += Read();
return returnValue;
}
0xffff
(所有位都等于1)对于有符号短路为-1,是的。阅读《Two’s complement》,了解更多细节。您可以切换到更大的数据类型,或者(按照Grzenio的建议)只使用无符号类型。
好吧,您似乎已经为单身人士找到了BitConverter
。现在,让我们看看我们是否可以将其用于其他一切。。。
MemoryStream mem = new MemoryStream(_array);
float ReadFloat(Stream str)
{
byte[] bytes = str.Read(out bytes, 0, 4);
return BitConverter.ToSingle(bytes, 0)
}
public int ReadInt32(Stream str)
{
byte[] bytes = str.Read(out bytes, 0, 4);
return BitConverter.ToInt32(bytes, 0)
}
您是否尝试使用ushort(无符号缩写)?
我认为使用System.BitConverter类会更好。
特别是对于空头,ToInt16方法。
你的问题中没有提到它,但你也应该确保你知道硬件设备正在用什么样的字节序写入数据。从你的例子来看,浮点值是用小字节序,但整数是用大端序?我怀疑硬件设备是否会在二进制数据的输出中混合尾数。
Yes 0xFFFF对于有符号短指令是-1。
另外,为什么不使用BinaryReader
类?
"short"的FFFF值为-1,而"unsigned short"则为65536。
在这种情况下,如果你确定所有的值都是正的,那么你应该确保你使用的是无符号的short。