[英]How to convert string to int then to string?
我試圖搜索我的問題的副本,但找不到。 此外,抱歉不那么容易理解的標題。 我對我正在搜索的內容以及術語非常困惑。 我是一名電子工程師,對.Net框架知之甚少,所以請好好對待:)
我目前的項目是一個心率監測器,可以將測得的心率存儲到EEPROM中,然后發送到PC進行日志查看。
我正在使用RS-232(串行)協議與8位微控制器連接。 每當我送一個char l
,這代表log
,給單片機,它會送我回去的格式如下一些信息:
0x1E 0x21 0x01 0x13 0x14 0x35 0x46 0x1E 0x21 0x01 0x13 0x14 0x43 0x48 0x0A 0x0D
空白空間用於信息目的,這些字節不是彼此分開的。
從微控制器發送的這些8位HEX值包括記錄信息的開始,其為0x1E
,格式為DD MM YY HH MM的日期和時間以及記錄的心率。 當所有記錄都被回顯時,則發送0x0A和0x0D字符。
例如,上面的代碼表示:
Record start.
21.01.13 14:35
Heart Rate: 70
Record start.
21.01.13 14:43
Heart Rate: 72
End of records.
我怎么能得到這樣的字符串值:“S210113143570S210113144372”,其中S
可以是任何東西。 之后,我將對此應用正則表達式語法並將其划分為組,以便我可以將這些值添加到listview
控件。
評論和答案后編輯:
我沒有寫錯誤的樣本。 不幸的是,編碼與上面完全一樣。
所以,實際上每個字節代表一個數字。 我假設你已經有一個包含這些值的byte[]
數組:
var data = new byte[] { 0x1E, 0x21, 0x01, 0x13, 0x14, 0x35, 0x46,
0x1E, 0x21, 0x01, 0x13, 0x14, 0x43, 0x48, 0x0A, 0x0D };
你現在可以像這樣創建真實的對象:
class LogEntry
{
public DateTime Timestamp { get; set; }
public int HeartRate { get; set; }
}
var logEntries = new List<LogEntry>();
for(int i = 0; i < data.Length; i+= 7)
{
if(data[i] == 0x0a && data[i + 1] == 0x0d)
break;
if(data[i] != 0x1e)
throw new InvalidDataException();
var logEntry = new LogEntry();
var year = BcdToDecimal(data[i + 3]) + 2000;
var month = BcdToDecimal(data[i + 2]);
var day = BcdToDecimal(data[i + 1]);
var hour = BcdToDecimal(data[i + 4]);
var minute = BcdToDecimal(data[i + 5]);
var heartRate = data[i + 6];
logEntry.Timestamp = new DateTime(year, month, day, hour, minute, 0);
logEntry.HeartRate = heartRate;
logEntries.Add(logEntry);
}
byte BcdToDecimal(byte bcdValue)
{
return (byte)((bcdValue / 16 * 10) + (bcdValue % 16));
}
方法BcdToDecimal
將BCD轉換為它們的實際值。
兄弟我認為你應該考慮使用字符串ie,
string heartRate=70;
string recordStart=21.01.13 14:35;
string fullValue = heartRate + '|' + recordStart;
現在,不是應用正則表達式,您可以使用拆分方法輕松拆分該字符串,例如,
string splittedValues[]=fullValue.Split('|');
你會在需要的時候獲得這些價值
splittedValues[0] \\it will be heard rate string (at index zero)
similarly
splittedValues[1] \\it will be record start string (at index one)
我仍然不明白你的問題,如果我的答案無關緊要,請告訴我,我會澄清
public static String ParseData(String data)
{
MatchCollection matches = Regex.Matches(data, "0[xX]([a-fA-F0-9]{2})");
Int32 count = 0;
String result = String.Empty;
foreach (Match match in matches)
{
switch (count)
{
case 0:
{
if (match.Value.Equals("0x1E", StringComparison.OrdinalIgnoreCase))
{
result += "S";
break;
}
goto End;
}
case 1:
case 2:
case 3:
case 4:
case 5:
result += match.Groups[1].Value;
break;
case 6:
result += Int32.Parse(match.Groups[1].Value, NumberStyles.HexNumber).ToString();
count = -1;
break;
}
++count;
}
End:;
return result;
}
我很抱歉我的這個非常愚蠢的錯誤。 在微控制器方面,我看到它非常容易,而不是時鍾周期消耗。 現在我已經完成了這個,現在很容易解析這些值。
我在微控制器方面使用過這個例程:
unsigned char BCDtoDecimal(unsigned char bcd_number)
{
return ((bcd_number>>4)*10 + (bcd_number&0x0F));
}
所以,C#方面的代碼非常簡單:
private void buttonGetLogs_Click(object sender, EventArgs e)
{
string inputBuffer;
char[] charArray;
try
{
serialPort.Write("l");
inputBuffer = serialPort.ReadLine();
charArray = inputBuffer.ToCharArray();
inputBuffer = string.Empty;
foreach (char item in charArray)
{
inputBuffer += Convert.ToInt32(item).ToString();
}
}
catch (Exception) { }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.