【问题标题】:Convert a C printf(%c) to C#将 C printf(%c) 转换为 C#
【发布时间】:2010-08-13 00:15:38
【问题描述】:

我正在尝试将此 C printf 转换为 C#

printf("%c%c",(x>>8)&0xff,x&0xff);

我尝试过这样的事情:

int x = 65535;

char[] chars = new char[2];
chars[0] = (char)(x >> 8 & 0xFF);
chars[1] = (char)(x & 0xFF);

但我得到了不同的结果。 我需要将结果写入文件 所以我这样做:

tWriter.Write(chars);

也许这就是问题所在。

谢谢。

【问题讨论】:

  • 使用 C 版本会得到什么结果,使用 C# 版本会得到什么结果?
  • 对于这个值 -> 65535 C 返回 -> ÿÿ C# 返回 -> ÿÿ
  • 我可能是错的,但我认为 ÿ 是 ÿ 在解释为 Windows-1252 而不是 UTF-8 时的 UTF-8 序列。

标签: c# c printf


【解决方案1】:

在 .NET 中,char 变量存储为无符号的 16 位(2 字节)数字,值范围从 0 到 65535。所以使用这个:

        int x = (int)0xA0FF;  // use differing high and low bytes for testing

        byte[] bytes = new byte[2];
        bytes[0] = (byte)(x >> 8);  // high byte
        bytes[1] = (byte)(x);       // low byte

【讨论】:

    【解决方案2】:

    如果您要使用 BinaryWriter 而不是只进行两次写入:

    bw.Write((byte)(x>>8));
    bw.Write((byte)x);
    

    请记住,您刚刚执行了 Big Endian 写入。如果希望它以 Little Endian 形式将其读取为 16 位整数,请交换写入。

    【讨论】:

      【解决方案3】:

      好的,

      我使用 Mitch Wheat 建议并将 TextWriter 更改为 BinaryWriter。

      这里是代码

      System.IO.BinaryWriter bw = new System.IO.BinaryWriter(System.IO.File.Open(@"C:\file.ext", System.IO.FileMode.Create));
      
      int x = 65535;
      
      byte[] bytes = new byte[2];
      bytes[0] = (byte)(x >> 8);
      bytes[1] = (byte)(x);
      
      bw.Write(bytes);
      

      感谢大家。 尤其是米奇小麦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 2020-06-27
        相关资源
        最近更新 更多