使用StreamWriter的C#脚本创建额外字符?

时间:2012-02-08 15:17:55

标签: c# sql sql-server-2008 ssis bids

我在SSIS中使用C#脚本任务输出ASCII字符。我这样做是因为我正在使用Packed字段创建一个文件,一个压缩字段在每个字节中使用两位数字,使用称为二进制编码十进制的符号。

所以,我发现当输出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

更新 我没注意的一件事是我将Hex值传递给C#脚本,然后将十六进制值表示的字符写入具有固定长度列的文件。

我不知道这是否有所作为,但我也会在文件中写入其他内容,这些内容与打包值在同一行上不是打包值,因此也就是使用StreamWriter的原因。

3 个答案:

答案 0 :(得分:3)

StreamWriter用于将文字写入流。它总是使用编码,如果你在创建它时没有指定它,它将使用UTF-8(没有字节顺序标记 - BOM)。你得到的输出是UTF-8编码器试图将文本(以单个字符的形式)翻译成UTF-8。

如果要将 bytes 写入流,只需使用接受字节数组的Write方法直接写入流。如果要写入文件,可以创建FileStream并将其用作流。

System.IO命名空间中的类的命名有时会令人困惑:

  • Stream是一个抽象基类,提供读写字节的方法
  • FileStream是一个Stream,可以读取和写入文件
  • BinaryWriter允许您将二进制形式的基本类型写入Stream
  • TextWriter是一个允许您编写文本的抽象基类
  • StreamWriter是一个TextWriter,可让您将文字写入Stream

您可能应该在FileStream之上使用BinaryWriterFileStream来解决您的问题。

答案 1 :(得分:1)

答案 2 :(得分:1)

这是一个编码问题。 如果你写* byte * s就不会发生。

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

更好的解决方案是选择正确的编码。但是你的角色在文件中看起来的方式真的很重要吗?