如何从字节转换?到字节[]?
How to Convert from byte? to byte[]?
我正在尝试转换从数据库查询中收到的字节。
EF Core returns 可空 tinyint
为 byte?
我需要将其转换为 decimal
.
有什么方法可以在 DbContext
中使用模型构建器将它 OnModelCreating
转换吗?
我对 EF Core 不是很熟悉。到目前为止,我只能做到这一点——在我已经在处理程序中得到我的对象之后:
decimal? newDecimal = Convert.ToDecimal(BitConverter.ToDouble(AddByteToArray(priceByte), 0)));
private static byte[] AddByteToArray(byte? newByte)
{
if (newByte != null)
{
if(newByte == 0)
{
return Enumerable.Repeat((byte)0x0, 8).ToArray();
}
byte[] bArray = new byte[1];
// Not sure how to convert a non null and byte > 0 to byte[]?? As double requires byte[] while the tinyint return byte from the database
return bArray;
}
return null;
}
而不是
byte[] bArray = new byte[1];
您可以使用
byte[] bArray = {(byte)newByte};
我认为您对这里的类型有点困惑。 DB returns a byte?
用于 tinyint 因为 a tinyint
只有 8 位数据。但否则它是一个整数。如果你想将它转换为 decimal
,你将使用与将 int
或 long
转换为 decimal
相同的机制:转换它。您不想将字节数组转换为 decimal
,因为这会尝试将数组中的数据解释为十进制的二进制表示(请参阅我的最后一段)。所以这段代码应该足以进行转换。
decimal? d = newByte == null ? null : (decimal)newByte;
看到这里可以进行这样的转换:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
请注意此处的备注部分,它表示我们正在处理数字的二进制表示,在处理字节顺序等时必须小心。
https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter?view=net-6.0#remarks
基本上,大于一个字节的数字在技术上存储为字节数组(因为在 x86 中所有内存都是字节可寻址的)但是将这些字节转换为数字取决于数字的类型。对于浮点数,尤其是字节数组中的数据结构很复杂,分为表示基数、指数和符号的字段。这些并不总是以直截了当的方式解释。如果你只给出一个字节数组,第一个字节是 27,你不知道它在构成双精度数的二进制表示的几个字段中的什么地方结束。它可能会很好地工作,但可能不会。
我正在尝试转换从数据库查询中收到的字节。
EF Core returns 可空 tinyint
为 byte?
我需要将其转换为 decimal
.
有什么方法可以在 DbContext
中使用模型构建器将它 OnModelCreating
转换吗?
我对 EF Core 不是很熟悉。到目前为止,我只能做到这一点——在我已经在处理程序中得到我的对象之后:
decimal? newDecimal = Convert.ToDecimal(BitConverter.ToDouble(AddByteToArray(priceByte), 0)));
private static byte[] AddByteToArray(byte? newByte)
{
if (newByte != null)
{
if(newByte == 0)
{
return Enumerable.Repeat((byte)0x0, 8).ToArray();
}
byte[] bArray = new byte[1];
// Not sure how to convert a non null and byte > 0 to byte[]?? As double requires byte[] while the tinyint return byte from the database
return bArray;
}
return null;
}
而不是
byte[] bArray = new byte[1];
您可以使用
byte[] bArray = {(byte)newByte};
我认为您对这里的类型有点困惑。 DB returns a byte?
用于 tinyint 因为 a tinyint
只有 8 位数据。但否则它是一个整数。如果你想将它转换为 decimal
,你将使用与将 int
或 long
转换为 decimal
相同的机制:转换它。您不想将字节数组转换为 decimal
,因为这会尝试将数组中的数据解释为十进制的二进制表示(请参阅我的最后一段)。所以这段代码应该足以进行转换。
decimal? d = newByte == null ? null : (decimal)newByte;
看到这里可以进行这样的转换:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
请注意此处的备注部分,它表示我们正在处理数字的二进制表示,在处理字节顺序等时必须小心。
https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter?view=net-6.0#remarks
基本上,大于一个字节的数字在技术上存储为字节数组(因为在 x86 中所有内存都是字节可寻址的)但是将这些字节转换为数字取决于数字的类型。对于浮点数,尤其是字节数组中的数据结构很复杂,分为表示基数、指数和符号的字段。这些并不总是以直截了当的方式解释。如果你只给出一个字节数组,第一个字节是 27,你不知道它在构成双精度数的二进制表示的几个字段中的什么地方结束。它可能会很好地工作,但可能不会。