C#:给定一个指定长度的字符串,根据位置和长度替换数组中的字符

时间:2016-04-15 22:55:44

标签: c# arrays string hex stringbuilder

给出以下我从XML文件中读取的值:

00B50578 00A41434 00B50578

并且,给出以下字符串:

string foo = "6F6F6F6F6F";

我想以某种方式用“foo”中的字符替换我正在从XML文件中读取的字符。但是,我想在“00”之后开始替换这些字符,并且只能继续替换这些字符,使其等于“foo”的长度。所以,如果我按照自己的方式行事,新值将如下:

00的 6F6F6F 00的 6F6F 34 00B50578

我尝试了几种方法来解决这个问题,但无济于事。

假设我将XML值读入名为“arrXmlValues”的数组中,我编写的代码看起来像这样......

        string foo = "6F6F6F6F6F";
        string[] arrXmlValues = new String[] { xmlReader.GetAttribute("w:val") };

        foreach (string r in arrXmlValues)
        {
            Console.WriteLine("Original value was : {0}", r);

            StringBuilder sb = new StringBuilder(r);
            sb.Remove(2, foo.Length);
            sb.Insert(2, foo);

            Console.WriteLine("New value is : {0}", sb);
            Console.WriteLine("");
        }

这里需要注意的是,十六进制值的8位数字必须保持不变。所以,我一次只能替换每个块中的6个字符,并且未写入列表中第一个块的任何内容必须写入列表上的第二个块,但前提是我已经离开写入了变量“foo”...

当然,可以通过新的方式来实现这一目标以及您可能提供的任何想法。我不是一个强大的程序员,但我的目标是为学校项目解决这个问题,同时也要学习。

我感谢任何帮助,指导。实现这一目标的示例代码将非常棒。谢谢!!!

2 个答案:

答案 0 :(得分:2)

这是一个有趣的。关键是在处理之前将输入字符串分解为较小的子集,因为您需要保持空格对齐。

static void Main(string[] args)
{
    string input = "00B50578 00A41434 00B50578";
    string foo = "6F6F6F6F6F";

    // start with a queue of characters filled with the
    // letters we are going to put into the input string.
    Queue <char> fooQueue = new Queue<char>(foo); 

    StringBuilder result = new StringBuilder();

    // iterate through each split, so that we maintain spaces.
    foreach (var item in input.Split(' '))
    {
        // go through each set of two characters in this specific chunk.
        for (int i = 0; i < item.Length - 1; i += 2) 
        {
            var substring = item.Substring(i, 2); // look at each chunk.
            if (substring == "00") // if the chunk is 00, then append 00. 
            {
                result.Append("00");
            }
            else // otherwise
            {
                // take either the next two characters out of the queue
                //and append them, or if the queue is empty, append the 
                //letters from the original text.
                for (int j = 0; j < 2; j++) 
                {
                    if (fooQueue.Count >= 1)
                        result.Append(fooQueue.Dequeue());
                    else
                        result.Append(substring[j]);
                }
            }
        }

        // add a space at the end of the chunk. 
        result.Append(' ');
    }

    // print all the chunks, but trim the end (which should at 
    // this point have an additional space at the end.
    Console.WriteLine(result.ToString().Trim());
}

答案 1 :(得分:0)

可以使用... // Real Time Departure from a given station router.route('/departTimeStation') .get(function(req, res) { vCmd = 'etd'; vOrig = req.query.vOriginStation; vDir = 'n'; // [NOTE] - 'n' or 's', north or south, OPTIONAL vPlat = 1; // [NOTE] - 1 to 4, number of platform, OPTIONAL var xoptions = { host: 'api.bart.gov', path: '/api/etd.aspx?cmd=' + vCmd + '&orig=' + vOrig + '&key=' + config.bart.client }; var xcallback = function(response) { response.on('data', function(chunk) { vParsed += chunk; }); response.on('end', function() { parseString(vParsed, function(err, result) { vShow = JSON.stringify(result); vTemp = result; }); }); }; http.request(xoptions, xcallback).end(); return res.send (vTemp) }); ... 循环和变量(for)来跟踪index字符串中剩余的字符数。

Working fiddle

foo