我是C ++开发人员,最近转向C#。我正在开发一个wpf应用程序,我需要在String.Format
上工作。在My 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
也有帮助,我宁愿选择easyiset方式。我在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上? :)请帮助:)
答案 0 :(得分:2)
您的C ++代码与C#代码不同。您在sprintf之前屏蔽并移位每个字节。 C#无法知道如何屏蔽单个字节来制作字符串。
现在没多少时间..但基本上是这样的......
verString = String.Format("FPGA 0x42 Version (dd/mm/yyyy ID): {0}/{1}/20{2} {3}", ((buffer[3] & 0xF8) >> 3),
(buffer[2] & 0x0F), ((buffer[2] & 0xF0) >> 4), (buffer[3] & 0x07));
或者你可以在调用convert
之前逐字节地执行它而不使用String.Format