Скопировать двоичные данные в буфер обмена

Как я могу скопировать двоичные данные в буфер обмена? Например, если я упаковываю число 1 как 4-байтовое целое число с прямым порядком байтов, я хочу, чтобы мой буфер обмена показывал 00 00 00 01

Для текстовых данных это тривиально, с возможностью иметь текст Unicode или текст ASCII.

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

Однако для двоичных данных я не знаю, что делать.

1 ответ

Решение

Есть два способа сделать это:

Первый и, безусловно, самый простой: вы просто помещаете байтовый массив в буфер обмена. Это автоматически сериализует байтовый массив и десериализует его при извлечении, и все, что вам нужно сделать, это проверить typeof(Byte[]),

Поместить в буфер обмена:

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"))
        return null;
    MemoryStream byteStream = retrievedData.GetData("rawbinary") as MemoryStream;
    if (byteStream == null)
        return null;
    return byteStream.ToArray();
}

Этот второй тип часто используется для пользовательских форматов; например, буфер обмена Office помещает изображения в буфер обмена в виде потока байтов PNG (с идентификатором "PNG"), поскольку в стандартном типе изображения буфера обмена отсутствует поддержка прозрачности.

Другие вопросы по тегам