Что означают первые и последние байты содержимого, помещенные в буфер обмена с помощью Clipboard.SetData ()? - PullRequest
0 голосов
/ 25 августа 2018

Я использую C # для добавления содержимого в буфер обмена Windows, например:

System.Windows.Forms.Clipboard.SetData("Foo Format", "Hello World");

Поскольку данные являются строкой, я ожидал, что они просто вставят строковые данные в буфер обмена, но в начале и в конце были добавлены дополнительные биты, т. Е .:

00000000   96 A7 9E FD 13 3B 70 43 A6 79 56 10 6B B2 88 FB    –§žý.;pC¦yV.k²ˆû
00000010   00 01 00 00 00 FF FF FF FF 01 00 00 00 00 00 00    .....ÿÿÿÿ.......
00000020   00 06 01 00 00 00 0B 48 65 6C 6C 6F 20 57 6F 72    .......Hello Wor
00000030   6C 64 0B                                           ld.        

Что означают первые 39 и последние байты? Есть ли способ поместить необработанную строку в буфер обмена с помощью C #?

1 Ответ

0 голосов
/ 25 августа 2018

Использование System.IO.MemoryStream добавляет строки в буфер обмена без лишних байтов в начале и в конце строковых значений.

Например, следующая строка представляет фрагмент таблицы Microsoft Excel:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        string content = @"<?xml version=""1.0""?>
<?mso-application progid=""Excel.Sheet""?>
<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""
 xmlns:o=""urn:schemas-microsoft-com:office:office""
 xmlns:x=""urn:schemas-microsoft-com:office:excel""
 xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""
 xmlns:html=""http://www.w3.org/TR/REC-html40"">
 <Styles>
  <Style ss:ID=""Default"" ss:Name=""Normal"">
   <Alignment ss:Vertical=""Bottom""/>
   <Borders/>
   <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID=""s18"" ss:Name=""Currency"">
   <NumberFormat
    ss:Format=""_(&quot;$&quot;* #,##0.00_);_(&quot;$&quot;* \(#,##0.00\);_(&quot;$&quot;* &quot;-&quot;??_);_(@_)""/>
  </Style>
  <Style ss:ID=""s64"">
   <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""
    ss:Bold=""1""/>
  </Style>
  <Style ss:ID=""s65"" ss:Parent=""s18"">
   <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/>
  </Style>
 </Styles>
 <Worksheet ss:Name=""Sheet1"">
  <Table ss:ExpandedColumnCount=""2"" ss:ExpandedRowCount=""2""
   ss:DefaultRowHeight=""15"">
   <Row>
    <Cell><Data ss:Type=""String"">Month</Data></Cell>
    <Cell><Data ss:Type=""String"">Year</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID=""s64""><Data ss:Type=""String"">August</Data></Cell>
    <Cell ss:StyleID=""s65""><Data ss:Type=""Number"">999.99</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>";

Передача его классу Clipboard в виде строки:

Clipboard.SetData("XML Spreadsheet", content);

Создает несовместимый формат с Excel, и Excel при попытке вставки этого содержимого выдает следующую ошибку:

enter image description here

Однако, сериализация его в байты с последующей передачей в виде MemoryStream :

Clipboard.SetData("XML Spreadsheet", new MemoryStream(Encoding.UTF8.GetBytes(content)));

Создаетсодержимое буфера обмена, совместимое с Excel:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...