簡體   English   中英

如何將字符串轉換為int然后轉換為字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM