将二进制数据复制到剪贴板

6

如何在剪贴板中复制二进制数据?例如,如果我将数字 1 打包为 4 字节的小端整数,则希望我的剪贴板显示 00 00 00 01

对于文本数据,这很简单,可以选择使用 Unicode 文本或 ASCII 文本。

Clipboard.SetData(DataFormats.Text, "Some text");
Clipboard.SetData(DataFormats.UnicodeText, "赤");

然而,对于二进制数据,我不知道该怎么办。
1个回答

10
实际上有两种方法可以做到这一点:
第一种,也是最简单的一种:将字节数组放入剪贴板。这将自动序列化字节数组,并在检索时进行反序列化,您需要做的就是检查typeof(Byte[])。事实上,对于任何可序列化类型(您可以使用[Serializable]属性使自己的类可序列化),都适用此方法。
放到剪贴板上:
public void PutBytesOnClipboardObj(Byte[] byteArr)
{
    DataObject data = new DataObject();
    // Can technically just be written as "SetData(byteArr)", but this is more clear.
    data.SetData(typeof(Byte[]), byteArr);
    // The 'copy=true' argument means the data will remain available
    // after the program is closed.
    Clipboard.SetDataObject(data, true);
}

从剪贴板检索:

public byte[] GetBytesFromClipboardObj()
{
    DataObject retrievedData = Clipboard.GetDataObject() as DataObject;
    if (retrievedData == null || !retrievedData.GetDataPresent(typeof(Byte[])))
        return null;
    return retrievedData.GetData(typeof(Byte[])) as Byte[];
}

如果您绝对希望将它作为纯原始字节存在,另一个可能性是将其作为MemoryStream放入剪贴板。在DataFormats列表中没有特定类型,但由于列出的数据格式只是字符串,您可以自己编造。在下面的示例中,我使用了"rawbinary"。

放入剪贴板:

public void PutBytesOnClipboardRaw(Byte[] byteArr)
{
    DataObject data = new DataObject();
    using (MemoryStream memStream = new MemoryStream())
    {
        memStream.Write(byteArr, 0, byteArr.Length);
        data.SetData("rawbinary", false, memStream);
        // The 'copy=true' argument means the MemoryStream
        // can be safely disposed after the operation.
        Clipboard.SetDataObject(data, true);
    }
}

从剪贴板中检索:

public Byte[] GetBytesFromClipboardRaw()
{
    DataObject retrievedData = Clipboard.GetDataObject() as DataObject;
    if (retrievedData == null || !retrievedData.GetDataPresent("rawbinary", false))
        return null;
    MemoryStream byteStream = retrievedData.GetData("rawbinary", false) as MemoryStream;
    if (byteStream == null)
        return null;
    return byteStream.ToArray();
}

这种第二种类型通常用于自定义格式,例如,Office剪贴板将图像作为PNG字节流(带有标识符“PNG”)放入剪贴板,因为标准剪贴板图像类型不支持透明度。

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