【问题标题】:C# .NET BitConverter doesn't work for SQL Server stored VarBinary readC# .NET BitConverter 不适用于 SQL Server 存储的 VarBinary 读取
【发布时间】:2013-09-07 02:09:12
【问题描述】:

我们将一个整数作为VARBINARY 存储在我们的SQL Server 2008 数据库中。使用 Entity Framework,在读取这个 VARBINARY 值时,它会向 C# 代码返回一个字节数组。

是的。我知道将整数作为VARBINARY 立即存储在数据库中并不一定有意义。这种存储方法是有充分理由的。

因此,如果您使用SELECT 语句检查表,则整数值 10762007 实际上是 0xA43717。将代码读入字节数组后,我们在代码中得到的实际值为:

byte[] b = new byte[]{0, 164, 55, 23};

现在,外行可能会认为简单的转换回整数会是:

int myInt = BitConverter.ToInt32(b);

...不会产生预期的结果。

我通过以下操作解决了这个问题:

string bitString = string.Empty;
string[] bitArray = new string[4];

for ( int i = 0; i < 4; i++)
{
   bitArray[i] = Convert.ToString((int)b[i],2).PadLeft(8,"0");
   bitString += bitArray[i];
}

int theRealInt = Convert.ToInt32(bitString,2);

这实质上是将我的十六进制值的整数表示,将它们转换为位字符串,适当地附加它们,然后将大而巨大的位字符串转换回整数。

这可行,但似乎我做的工作超出了我的需要。有没有更简单的方法来执行此操作?基本上,我们将一个整数作为 VARBINARY 存储在数据库中,然后希望在 C# 代码中将其转换回相同的整数。

【问题讨论】:

    标签: c# .net sql sql-server-2008 type-conversion


    【解决方案1】:

    试试吧

    var myInt = BitConverter.ToInt32(b.Reverse().ToArray(),0);
    

    var myInt = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b,0));
    

    关于Endianness

    【讨论】:

    • 虽然效果不错,但我从来没有热衷于盗用NetworkToHostOrder
    • 谢谢。这太棒了。
    【解决方案2】:

    Jon Skeet 有一个用于处理 endian 问题的 BitConverter (MiscUtil.Conversion.EndianBitConverter) 替代品,可以在 Miscellaneous Utility Library 中找到它

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多