Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将字节值转换为小数?_C#_.net - Fatal编程技术网

C# 如何将字节值转换为小数?

C# 如何将字节值转换为小数?,c#,.net,C#,.net,我正试图从文件中加载一些十进制值,但我无法找到正确的方法来获取原始值并将其转换为十进制 我已经将文件读入一个字节数组,四个字节的每一块应该代表一个十进制值。为了帮助解决这个问题,我构建了一个关于十进制值1到46如何表示为四字节块的表 例如,数字1显示为0,0128,63,数字2显示为0,0,0,64,依此类推至46,即0,0,56,66。满桌都有 还有另一系列数字,小数点后三位,包括负数,也就是 我仅有的文件是 它们首先存储最低有效字节:1、256、65536、16777216。这使得十六进制序

我正试图从文件中加载一些十进制值,但我无法找到正确的方法来获取原始值并将其转换为十进制

我已经将文件读入一个字节数组,四个字节的每一块应该代表一个十进制值。为了帮助解决这个问题,我构建了一个关于十进制值1到46如何表示为四字节块的表

例如,数字1显示为0,0128,63,数字2显示为0,0,0,64,依此类推至46,即0,0,56,66。满桌都有

还有另一系列数字,小数点后三位,包括负数,也就是

我仅有的文件是

它们首先存储最低有效字节:1、256、65536、16777216。这使得十六进制序列01 00变成数字257(十进制)。在C/C++中,要读取例如一个浮点,do:float x;fread(&x,sizeof(float),1,fileptr)


但是,我使用的是.NET的File.ReadAllBytes方法,所以这没有多大帮助。如果有人能抽出几分钟来查看示例文件,看看他们是否能找到一种将值转换为小数的方法,我将不胜感激。

您研究过使用BitConverter类吗?它在字节数组和各种类型之间进行转换

编辑: MSDN对BitConverter的文档发表了有益的评论,网址为:

公共静态十进制到十进制(字节[]字节)
{
int[]位=新的int[4];
位[0]=(字节[0]|(字节[1]0x18);
字节[8]=(字节)hi;
字节[9]=(字节)(hi>>8);
字节[10]=(字节)(hi>>0x10);
字节[11]=(字节)(hi>>0x18);
字节[12]=(字节)标志;
字节[13]=(字节)(标志>>8);
字节[14]=(字节)(标志>>0x10);
字节[15]=(字节)(标志>>0x18);
返回字节;
}
您可以使用从字节数组中读取浮点值,因此要获得浮点序列,您可以执行以下操作:

byte[] data = File.ReadAllBytes(fileName);
int count = data.Length / 4;
Debug.Assert(data.Length % 4 == 0);

IEnumerable<float> values = Enumerable.Range(0, count)
    .Select(i => BitConverter.ToSingle(data, i*4));
byte[]data=File.ReadAllBytes(文件名);
整数计数=数据长度/4;
Assert(data.Length%4==0);
IEnumerable values=可枚举范围(0,计数)
.Select(i=>BitConverter.ToSingle(数据,i*4));

如其他人所述,使用该类,请参见下面的示例:

     byte[] bytez = new byte[] { 0x00, 0x00, 0x80, 0x3F };
     float flt = BitConverter.ToSingle(bytez, 0); // 1.0

     bytez = new byte[] { 0x00, 0x00, 0x00, 0x40 };
     flt = BitConverter.ToSingle(bytez, 0); // 2.0

     bytez = new byte[] { 0, 0, 192, 190 };
     flt = BitConverter.ToSingle(bytez, 0); // -0.375

.NET库在内部实现了
Decimal.GetBytes()
方法

我使用反编译的.NET库创建了十进制和字节数组之间的简单转换方法-您可以在这里找到:

编辑:这是我链接中的完整源代码

public decimal BytesToDecimal(byte[] buffer, int offset = 0)
{
  var decimalBits = new int[4];

  decimalBits[0] = buffer[offset + 0] | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24);
  decimalBits[1] = buffer[offset + 4] | (buffer[offset + 5] << 8) | (buffer[offset + 6] << 16) | (buffer[offset + 7] << 24);
  decimalBits[2] = buffer[offset + 8] | (buffer[offset + 9] << 8) | (buffer[offset + 10] << 16) | (buffer[offset + 11] << 24);
  decimalBits[3] = buffer[offset + 12] | (buffer[offset + 13] << 8) | (buffer[offset + 14] << 16) | (buffer[offset + 15] << 24);

  return new Decimal(decimalBits);
}

public byte[] DecimalToBytes(decimal number)
{
  var decimalBuffer = new byte[16];

  var decimalBits = Decimal.GetBits(number);

  var lo = decimalBits.Value[0];
  var mid = decimalBits.Value[1];
  var hi = decimalBits.Value[2];
  var flags = decimalBits.Value[3];

  decimalBuffer[0] = (byte)lo;
  decimalBuffer[1] = (byte)(lo >> 8);
  decimalBuffer[2] = (byte)(lo >> 16);
  decimalBuffer[3] = (byte)(lo >> 24);

  decimalBuffer[4] = (byte)mid;
  decimalBuffer[5] = (byte)(mid >> 8);
  decimalBuffer[6] = (byte)(mid >> 16);
  decimalBuffer[7] = (byte)(mid >> 24);

  decimalBuffer[8] = (byte)hi;
  decimalBuffer[9] = (byte)(hi >> 8);
  decimalBuffer[10] = (byte)(hi >> 16);
  decimalBuffer[11] = (byte)(hi >> 24);

  decimalBuffer[12] = (byte)flags;
  decimalBuffer[13] = (byte)(flags >> 8);
  decimalBuffer[14] = (byte)(flags >> 16);
  decimalBuffer[15] = (byte)(flags >> 24);

  return decimalBuffer;
}
public decimal BytesToDecimal(字节[]缓冲区,int offset=0)
{
var小数位数=新整数[4];
小数位数[0]=缓冲区[offset+0]|(缓冲区[offset+1]24);
小数缓冲区[8]=(字节)高电平;
小数缓冲区[9]=(字节)(hi>>8);
小数缓冲区[10]=(字节)(hi>>16);
小数缓冲区[11]=(字节)(hi>>24);
小数缓冲区[12]=(字节)标志;
小数缓冲区[13]=(字节)(标志>>8);
小数缓冲区[14]=(字节)(标志>>16);
小数缓冲区[15]=(字节)(标志>>24);
返回小数缓冲区;
}

我已将其标记为正确,因为它更为详细。非常感谢,我不希望它如此简单。谢谢,这绝对是正确的方法。不幸的是,它没有实现十进制转换。@EranBetzalel MSDN有一些代码来实现“缺失”BitConverter的成员。请参阅我编辑的更新。@BlueMonkMN,它不是MSDN的,只是某个人在那里发布的,他可能是从我从.Net反编译库中获取它的同一个地方获取的。它与BitConverter无关。@Eranbetzale我的观点是,它是MSDN的网站,其中包含内容和BitConverter的页面可以找到e内容。我并不声称它本质上与MSDN或bitconverter相连(我甚至注意到它是一个“注释”)。但解决方案是一个解决方案,无论是谁编写的,也不管它在何处。现在解决方案在StackOverflow上。由您,编码人员,来确定代码是否适合您,而不是根据它来自何处的凭据来确定。代码可以根据其自身的优点独立判断。
public decimal BytesToDecimal(byte[] buffer, int offset = 0)
{
  var decimalBits = new int[4];

  decimalBits[0] = buffer[offset + 0] | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24);
  decimalBits[1] = buffer[offset + 4] | (buffer[offset + 5] << 8) | (buffer[offset + 6] << 16) | (buffer[offset + 7] << 24);
  decimalBits[2] = buffer[offset + 8] | (buffer[offset + 9] << 8) | (buffer[offset + 10] << 16) | (buffer[offset + 11] << 24);
  decimalBits[3] = buffer[offset + 12] | (buffer[offset + 13] << 8) | (buffer[offset + 14] << 16) | (buffer[offset + 15] << 24);

  return new Decimal(decimalBits);
}

public byte[] DecimalToBytes(decimal number)
{
  var decimalBuffer = new byte[16];

  var decimalBits = Decimal.GetBits(number);

  var lo = decimalBits.Value[0];
  var mid = decimalBits.Value[1];
  var hi = decimalBits.Value[2];
  var flags = decimalBits.Value[3];

  decimalBuffer[0] = (byte)lo;
  decimalBuffer[1] = (byte)(lo >> 8);
  decimalBuffer[2] = (byte)(lo >> 16);
  decimalBuffer[3] = (byte)(lo >> 24);

  decimalBuffer[4] = (byte)mid;
  decimalBuffer[5] = (byte)(mid >> 8);
  decimalBuffer[6] = (byte)(mid >> 16);
  decimalBuffer[7] = (byte)(mid >> 24);

  decimalBuffer[8] = (byte)hi;
  decimalBuffer[9] = (byte)(hi >> 8);
  decimalBuffer[10] = (byte)(hi >> 16);
  decimalBuffer[11] = (byte)(hi >> 24);

  decimalBuffer[12] = (byte)flags;
  decimalBuffer[13] = (byte)(flags >> 8);
  decimalBuffer[14] = (byte)(flags >> 16);
  decimalBuffer[15] = (byte)(flags >> 24);

  return decimalBuffer;
}