【问题标题】:SQL Image DataType - C# Display OutputSQL 图像数据类型 - C# 显示输出
【发布时间】:2010-11-24 19:10:36
【问题描述】:

我的表中有一个图像数据类型。当我使用 SQL Server Management Studio 进行查询时,我在结果窗口中得到以下内容,包括网格和文本。

0x255044462D312E320D0A0D0A332030206F[截断长度]

我正在尝试在一个小 C# 程序中复制它。

但是,当我使用 SqlCommand 或 LINQ 时,我会得到以下输出: JVBERi0xLjINCg0KMyAwIG9iag0KPDwNCi9FIDIxODgyDQovSCBbIDExNTAgMTUxIF0NCi9MIDIyM[截断]

我需要做什么才能显示 0x25... 输出有什么想法吗?我尝试过进行 byte[] 转换和编码,但似乎找不到合适的。

如果我不清楚,请告诉我。

编辑: 我不是想显示图像,只是 0x25...

想法?

【问题讨论】:

  • "JVBERi0xLjINCg0...." 看起来像已编码。打印字节数组会得到什么?

标签: c# sql types


【解决方案1】:
string forDisplay = "0x" + BitConverter.ToString(yourByteArray).Replace("-", "");

【讨论】:

    【解决方案2】:

    AFAIK,.Net 不包含将任意字节数组打印为单个十六进制数字的任何方法。 (直到 .Net 4.0 的 System.Numerics.BigInteger

    不过,你应该会写

    "0x" + BitConverter.ToString(bytes).Replace("-", "")
    

    请注意,这是非常低效的;如果您想在实际代码中执行此操作,请在循环中使用 StringBuilder
    编辑:像这样:

    public static string ToHexString(this byte[] bytes) {
        var builder = new StringBuilder(bytes.Length * 2 + 2);
    
        builder.Append("0x");
    
        for (int i = 0; i < bytes.Length; i++)
            builder.Append(bytes[i].ToString("X2"));
    
        return builder.ToString();
    }
    

    2nd 编辑:这是一个真正更快的新版本。 (是的,我知道你不需要它;无论如何它都在这里)

    private static char ToHexDigit(int i) {
        if (i < 10) 
            return (char)(i + '0');
        return (char)(i - 10 + 'A');
    }
    public static string ToHexString(byte[] bytes) {
        var chars = new char[bytes.Length * 2 + 2];
    
        chars[0] = '0';
        chars[1] = 'x';
    
        for (int i = 0; i < bytes.Length; i++) {
            chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
            chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);
        }
    
        return new string(chars);
    }
    

    【讨论】:

    • 也感谢您的回复。这个程序不会投入生产,所以我不担心性能。感谢您的回复!
    • @SLaks:我刚刚进行了一些快速测试,StringBuilder 循环似乎比“效率极低”BitConverter/@ 慢 2 到 3 倍 987654329@.
    • 我无法想象为什么;我去看看。
    • 我再现了缓慢。我怀疑这是因为 byte.ToString,它需要解析其输入和处理文化等。这是一个真正更快的版本。
    • @SLaks:是的,新版本更快!这几乎是 BitConverter.ToString 在幕后所做的事情,但显然您跳过了添加连字符,这意味着您之后不需要调用 Replace 来删除它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2019-05-16
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多