【问题标题】:How to Convert from byte? to byte[]?如何从字节转换?到字节[]?
【发布时间】:2022-01-05 14:43:49
【问题描述】:

我正在尝试转换从数据库查询接收到的字节。

EF Core 将可空的 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;
}

【问题讨论】:

  • 我不得不说我对答案不明显感到震惊。你没有转换任何东西。只需将那个字节放入数组中!
  • 我刚开始尝试Convert.ToDecimal,但没有成功。
  • 这可能是因为该方法采用常规字节而不是可为空的字节。但是您可以通过在调用之前检查 null 然后转换为不可为空的字节来解决这个问题。这提醒您应该花时间了解类型在 C# 中的工作方式。听起来你只是在尝试一些事情,并希望有些事情能奏效。这是一种令人沮丧的编程方式
  • 我比较了解类型。我以前从未真正使用过字节。
  • 我在 db 上下文中尝试了 Convert.toDecimal() onmodelcreating 所以它更棘手。我之前也尝试过modelBuilder .Entity<MyObject>() .Property(e => e.Price) .HasConversion( v => v != null ? (decimal)v : null;,但没有成功,是的,这可能让我更加困惑。

标签: c# arrays entity-framework-core byte tinyint


【解决方案1】:

我认为您对这里的类型有些困惑。 DB 为 tinyint 返回 byte?,因为 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 作为第一个字节的字节数组,你不知道它在构成双精度二进制表示的几个字段中的最终位置。它可能很有效,但可能不会。

【讨论】:

  • 对努力表示敬意
【解决方案2】:

代替

byte[] bArray = new byte[1];

你可以使用

byte[] bArray = {(byte)newByte};

【讨论】:

  • 不,我不能那样做。我已经试过了。在您的情况下,字节数组只有 1 个项目,而通常是 8 个。您建议的解决方案返回:System.Private.CoreLib: Destination array is not long enough to copy all the items in the collection. Check array index and length. (Parameter 'value'). 转换为双精度:BitConverter.ToDouble(bytesArray, 0);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2018-08-20
  • 1970-01-01
  • 2023-02-26
  • 2014-02-02
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多