无法使用 String.Format 在 WPF 中显示版本字符串

Posted

技术标签:

【中文标题】无法使用 String.Format 在 WPF 中显示版本字符串【英文标题】:Failing to use String.Format to display Version String in WPF 【发布时间】:2012-10-29 04:54:30 【问题描述】:

我是一名 C++ 开发人员,最近转向 C#。我正在开发一个 wpf 应用程序,我需要在 String.Format 上工作。在我的 C++ 应用程序中,我使用了sprintf 来获得结果,但是当涉及到 C# 时,string.format 帮助我实现了它。现在我遇到了一个棘手的情况,我需要实现类似的事情但具有不同的价值。这是 C++ 代码:

char t_str[4] = ;
for(int i = 0; i < 4; i++)
 
    sprintf(t_str, "%02X", buffer[i]);
m_apiResponse[i]->setText(String(t_str));

其中buffer[0] = 20; buffer[1] = 30; buffer[2] = 40; buffer[3] = 50;m_apiResponse 是一个文本框。

尽管string.format 也很有帮助,但我宁愿选择简单的方法。我在我的 C# 中这样做了,如下所示:

Response1Box = buffer[0].ToString("X2");
Response2Box = buffer[1].ToString("X2");
Response3Box = buffer[2].ToString("X2");
Response4Box = buffer[3].ToString("X2");

效果很好,给了我想要的答案。但是现在我在我的 c++ 应用程序中遇到了它的一个扭曲版本.....这是代码:

unsigned char buffer[8] = ;
char verString[64] = ;

m_msp430->WriteInternalCommand(cmd, 1, buffer);
m_msp430->ReadInternalCommand(cmd, 4, buffer);

sprintf(verString, "FPGA 0x42 Version (dd/mm/yyyy ID): %02d/%02d/20%02d %02d", ((buffer[3] & 0xF8) >> 3), 
            (buffer[2] & 0x0F), ((buffer[2] & 0xF0) >> 4), (buffer[3] & 0x07));

m_versionString->setText(String(verString), false);

这里 m_versionString 是一个标签,一旦执行此语句,它就会打印例如FPGA 0x42 Version (dd/mm/yyyy ID): 00/00/2012 23。我在 C# 中尝试如下:

// Description of VersionString label which displays
    private string _VersionString;
    public string VersionString
    
        get
        
            return _VersionString;
        

        set
        
            _VersionString = value;
            OnPropertyChanged("VersionString");
        
    

    public void GetVersion()
    
        int cmd = 0x0A42;
        Byte[] buffer = new Byte[8];
        Byte[] verString = new Byte[64];

        mComm.WriteInternalCommand(cmd, 1, ref buffer);
        mComm.ReadInternalCommand(cmd, 4, ref buffer);            

        // Failing to figure out how to achieve it

        VersionString = Convert.ToString(verString);
    

如何执行这些操作并将其显示在我的 VersionString 上? :) 请帮忙 :)

【问题讨论】:

【参考方案1】:

您的 C++ 代码不等同于您的 C# 代码。您在 sprintf 之前屏蔽和位移每个字节。 C# 不可能知道如何屏蔽单个字节来生成字符串。

现在时间不多了..但基本上是这样的..

verString = String.Format("FPGA 0x42 Version (dd/mm/yyyy ID): 0/1/202 3", ((buffer[3] & 0xF8) >> 3), 
        (buffer[2] & 0x0F), ((buffer[2] & 0xF0) >> 4), (buffer[3] & 0x07));

或者你可以在调用 convert 之前逐个字节地进行而不用 String.Format

【讨论】:

感谢您的回复。是的你是对的。他们是否有任何替代方式可以完成单个位的屏蔽并且必须以 C++ 代码的方式实现结果? :) 你为什么不喜欢 String.format?我认为它和你一样最接近 sprintf,我会在我有时间的时候看到 ;-)

以上是关于无法使用 String.Format 在 WPF 中显示版本字符串的主要内容,如果未能解决你的问题,请参考以下文章

WPF中StringFormat的用法

String.format与手机设置的语言环境的关系导致语言转换系统无法识别闪退问题

String.format与手机设置的语言环境的关系导致语言转换系统无法识别闪退问题

C# 如何在wpf中使用response 或者功能与其方法类似的

LINQ to Entities 无法识别方法“System.String Format(System.String, System.Object, System.Object)”

Android String.format()返回问号(??)