将 SQL 二进制转换为字节数组

10

给定存储在SQL二进制字段中的一些数据:

0x83C8BB02E96F2383870CC1619B6EC...

我想将它转换为字节数组,但似乎不能直接对其进行强制类型转换:

byte[] someBytes = (byte) 0x83C8BB02E96F2383870CC1619B6EC...;

我在这里漏掉了什么?


查询二进制字段的数据库将返回一个字节数组。 - Diego Mijelshon
你现在有什么?字面文本?字符串? - SLaks
假设我正在使用查询分析器,并从二进制字段中进行选择,结果网格具有上面的值(我截断了示例,因为它超过300个字符)。 - JMP
为什么数据库中会有二进制数据? - NullUserException
2
因为这就是我继承下来的。 - JMP
3个回答

5

SQL字段中存储的数据是二进制的。你引用的“0x83…”字符串只是该二进制数据的十六进制表示。

如果你只想将十六进制数据复制/粘贴到你的C#代码(就像你似乎已经写过的那样),你需要将它从十六进制转换为二进制。.NET提供了一个(相当晦涩)的类来处理这种情况:

using System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary

public byte[] ToBytes(string hex)
{
    var shb = SoapHexBinary.Parse(hex);
    return shb.Value;
}

public void TestConvert()
{
    byte[] someBytes = ToBytes("83C8BB02E96F2383870CC1619B6EC");
}

如果您的二进制数据来自数据库而不是复制/粘贴字符串的形式,您需要提供有关您的设置的更多信息。


从字符串中删除0x是复制的数据和此处示例之间微妙但重要的区别。如果不这样做,您将会得到xsd:hexBinary错误。 - StingyJack
即使删除了 0x,我仍然收到 xsd:hexBinary invalid 错误。编辑:从末尾删除一个字符(使长度为偶数,我想)解决了这个问题。 - georgiaboy82
有没有在.NET Core中实现这个的方法?我找不到类似的库。 - codeMonkey

4
您的类型转换错误。
byte[] someBytes = (byte[]) 0x83C8BB02E96F2383870CC1619B6EC...;

我曾经遇到同样的问题,并且偶然发现了这个问题。经过进一步的研究,我尝试了像上面那样进行强制转换,它起作用了。


我遇到了“整数常量太大”的错误。你有什么想法吗? - codeMonkey

0

摘自此答案

从数据开头删除0x, 然后创建一个字符串:

var stringHex = "83C8BB02E96F2383870CC1619B6EC...";

然后使用这个方法将其转换为byte[]:

byte[] myArray = Enumerable.Range(0, stringHex.Length / 2)
                           .Select(x => Convert.ToByte(stringHex.Substring(x * 2, 2), 16))
                           .ToArray();

我不得不使用这种方法,因为我的数据太长了,所以我一直收到关于Int32和Int64溢出的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接