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

我试图从文件加载一些十进制值,但我不能工作了取原始值,并将其转换成十进制数的正确方法。如何将字节值转换为小数?

我已经读取的文件出到一个字节数组,并且四个字节每个块被认为代表一个十进制值。为了搞清楚,我已经构建了一个表格,说明如何将小数值1到46表示为四个字节的块。

例如,数字1显示为0,0,128,63数字2为0,0,0,64等高达46,这是0,0,56,66。全表可用here。

还有另一系列哪去了小数点后三位,包括底片,这是here数字。

唯一的文档我有状态

他们首先存储至少显著字节:1的,256的,65536的,16777216的。这使十六进制序列01 01 00 00成为数字257(十进制)。在C/C++中,阅读例如一个浮点数,do:float x; fread(& x,sizeof(float),1,fileptr);

但是我使用.NET的File.ReadAllBytes方法,所以这是没有太大的帮助。如果任何人都可以花几分钟时间查看示例文件,看看他们是否可以找到将值转换为小数的方法,我将非常感激。

回答:

您可以使用BitConverter.ToSingle来读取的字节数组浮点值,因此要获得花车的序列,你可以做这样的事情:

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));

回答:

有你看着使用BitConverter类?它在字节数组和各种类型之间进行转换。

编辑: MSDN有在http://msdn.microsoft.com/en-us/library/system.bitconverter_methods(v=vs.85).aspx为BitConverter的文档的帮助的注释:

public static decimal ToDecimal(byte[] bytes) 

{

int[] bits = new int[4];

bits[0] = ((bytes[0] | (bytes[1] << 8)) | (bytes[2] << 0x10)) | (bytes[3] << 0x18); //lo

bits[1] = ((bytes[4] | (bytes[5] << 8)) | (bytes[6] << 0x10)) | (bytes[7] << 0x18); //mid

bits[2] = ((bytes[8] | (bytes[9] << 8)) | (bytes[10] << 0x10)) | (bytes[11] << 0x18); //hi

bits[3] = ((bytes[12] | (bytes[13] << 8)) | (bytes[14] << 0x10)) | (bytes[15] << 0x18); //flags

return new decimal(bits);

}

public static byte[] GetBytes(decimal d)

{

byte[] bytes = new byte[16];

int[] bits = decimal.GetBits(d);

int lo = bits[0];

int mid = bits[1];

int hi = bits[2];

int flags = bits[3];

bytes[0] = (byte)lo;

bytes[1] = (byte)(lo >> 8);

bytes[2] = (byte)(lo >> 0x10);

bytes[3] = (byte)(lo >> 0x18);

bytes[4] = (byte)mid;

bytes[5] = (byte)(mid >> 8);

bytes[6] = (byte)(mid >> 0x10);

bytes[7] = (byte)(mid >> 0x18);

bytes[8] = (byte)hi;

bytes[9] = (byte)(hi >> 8);

bytes[10] = (byte)(hi >> 0x10);

bytes[11] = (byte)(hi >> 0x18);

bytes[12] = (byte)flags;

bytes[13] = (byte)(flags >> 8);

bytes[14] = (byte)(flags >> 0x10);

bytes[15] = (byte)(flags >> 0x18);

return bytes;

}

回答:

正如其他人所说,使用BitConverter类,见下面的例子:

 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库创建小数和字节arrary之间的简单转换方法 - 你可以在这里找到:

https://gist.github.com/eranbetzalel/5384006#file-decimalbytesconvertor-cs

编辑:以下是完整的源代码从我的链接。

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;

}

以上是 如何将字节值转换为小数? 的全部内容, 来源链接: utcz.com/qa/261594.html

回到顶部