C# 如何将字节值转换为小数?
我正试图从文件中加载一些十进制值,但我无法找到正确的方法来获取原始值并将其转换为十进制 我已经将文件读入一个字节数组,四个字节的每一块应该代表一个十进制值。为了帮助解决这个问题,我构建了一个关于十进制值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)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。这使得十六进制序
但是,我使用的是.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;
}