Основываясь на справочнике по структуре документа с разрешением .doc решил написать программу для получения текстовой части этого документа. Ниже представлен код моих наработок в которых не могу понять как объявить массив tableStreamName
и как преобразовать переменную fc
с UInt
в Int
.
Да и вообще скажите в чем ещё мои ошибки?!
private static void Main(string[] args)
{
string path = @"C:\temp\MyTest.doc";
string text = " ";
Stream wordDocumentStream = new FileStream(path, FileMode.Open);
byte[] fib = new byte[1472];
wordDocumentStream.Read(fib, 0, 1472);
int fcClx = BitConverter.ToInt32(fib, 0x01A2);
int lcbClx = BitConverter.ToInt32(fib, 0x01A6);
bool flag1Table = (fib[0x000A] & 0x0200) == 0x0200;
string tableStreamName = "0Table";
if (flag1Table) tableStreamName = "1Table";
Stream tableStream = new Stream(tableStreamName);
byte[] clx = new byte[lcbClx];
tableStream.Read(clx, fcClx, lcbClx);
int pos = 0;
bool goOn = true;
while (goOn)
{
byte typeEntry = clx[pos];
if (typeEntry == 2)
{
goOn = false;
int lcbPieceTable = BitConverter.ToInt32(clx, pos + 1);
byte[] pieceTable = new byte[lcbPieceTable];
Array.Copy(wordDocumentStream, pos + 5, pieceTable, 0, pieceTable.Length);
int pieceCount = (lcbPieceTable - 4) / 12;
for (var i = 0; i < pieceCount; i++)
{
int cpStart = BitConverter.ToInt32(pieceTable, i * 4);
int cpEnd = BitConverter.ToInt32(pieceTable, (i + 1) * 4);
byte[] pieceDescriptor = new byte[8];
int offsetPieceDescriptor = (pieceCount + 1) * 4 + i * 8;
Array.Copy(pieceTable, offsetPieceDescriptor, pieceDescriptor, 0, 8);
uint fcValue = BitConverter.ToUInt32(pieceDescriptor, 2);
bool isANSI = (fcValue & 0x40000000) == 0x40000000;
uint fc = fcValue & 0xBFFFFFFF;
Encoding encoding = Encoding.GetEncoding(1252);
int cb = cpEnd - cpStart;
if (!isANSI)
{
encoding = Encoding.Unicode;
cb *= 2;
}
byte[] bytesOfText = new byte[cb];
wordDocumentStream.Read(bytesOfText, bytesOfText.Length, fc);
text += encoding.GetString(bytesOfText);
}
}
else if (typeEntry == 1)
{
pos = pos + 1 + 1 + clx[pos + 1];
}
else
{
goOn = false;
}
}
Console.WriteLine(text);
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
На данный вопрос уже ответили:
Полет пули к цели с практически одинаковой скоростью осуществляется с помощью данного скрипта:
Реализую простой фасад для сокрытия более низкоуровневых решенийЕсть модель данных:
Имеется метод, который внутри себя запускает дважды другой метод, но второй раз асинхронноИ вот внутри Task не срабатывает SaveToDB()