Сценарий C # Использование StreamWriter Создает дополнительный символ? - PullRequest
1 голос
/ 08 февраля 2012

Я использую задачи сценария C # в SSIS для вывода символов ASCII. Я делаю это, потому что я создаю файл с упакованными полями, упакованное поле занимает две цифры в каждом байте, используя нотацию, называемую Binary Coded Decimal.

Итак, я обнаружил, что при выводе NUL (0x00) [Dec 0] с помощью Œ (0x8C) [Dec. 140] он добавляет дополнительный символ  (0xC2) между ними. Я не могу понять, почему это происходит. У кого-нибудь есть какие-либо идеи? Пожалуйста, смотрите мой код ниже:

string fileName;
System.IO.StreamWriter writer;

public override void PreExecute()
{
    base.PreExecute();

    this.fileName = this.Variables.FilePath;
}

public override void PostExecute()
{
    base.PostExecute();
    writer.Flush();
    writer.Close();
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    writer.Write((char)00);
    writer.Write((char)140);

    writer.Write((char)13);
    writer.Write((char)10);
}

Вывод ниже:

ExtraCharacter

UPDATE Одна вещь, на которую я не обращал внимания, это то, что я передаю шестнадцатеричные значения в скрипт C #, а затем записываю символы, представленные шестнадцатеричным значением, в файл со столбцами фиксированной длины.

Я не знаю, имеет ли это значение, но я также буду записывать в файл другие вещи, которые не являются упакованными значениями в тех же строках, что и упакованные значения, и, следовательно, причиной использования StreamWriter.

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

A StreamWriter для записи текста в поток. Он всегда использует кодировку, и если вы не укажете кодировку при создании, он будет использовать UTF-8 (без метки порядка байтов - BOM). Выходные данные - кодировщик UTF-8, пытающийся перевести текст (в виде отдельных символов) в UTF-8.

Если вы хотите записать байт в поток, просто запишите в поток напрямую, используя метод Write, который принимает массив байтов. Если вы хотите записать в файл, вы можете создать FileStream и использовать его в качестве потока.

Именование классов в пространстве имен System.IO может иногда сбивать с толку:

  • Stream - абстрактный базовый класс, предоставляющий методы для чтения и записи байтов
  • FileStream - это Stream, который читает и пишет в файл
  • BinaryWriter позволяет записывать примитивные типы в двоичном виде в Stream
  • TextWriter - абстрактный базовый класс, позволяющий писать текст
  • StreamWriter - это TextWriter, который позволяет записывать текст в Stream

Возможно, вам следует использовать FileStream или BinaryWriter поверх FileStream для решения вашей проблемы.

1 голос
/ 08 февраля 2012

Это проблема кодирования. Этого не должно произойти, если вы напишите * byte * s.

BinaryWriter writer = new BinaryWriter(someStream);
write.Write((byte)123); // just an example! not a "that's how you should do it"

Лучшим решением было бы выбрать правильную кодировку. Но имеет ли значение, как ваши персонажи выглядят в файле?

1 голос
/ 08 февраля 2012

Вы, возможно, не указали правильную кодировку вашего писателя.

См .: http://msdn.microsoft.com/en-us/library/72d9f8d5.aspx

и: http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx

...