求助一个算法

xggllc 2014-03-07 05:50:43
RT
事情是这样的:从PLC里面读取了一串字符(如:“020000020000020000”),需要转换成“P00 P01 ... P10 P11...”类似的字符串。目前是写了一个解析的脚本,使用了三个函数才完成转换,个人觉得代码太臃肿,所以发出来哪位大神有空的时候能指点一下,也让我长长见识。

下面详细的说明一下对应关系:
如“020000 020000 020000”,这个字符串六个分为一段,每段的 “02”是固定不变的,变动的只是“02”后面的 “0000”;这4个“0”一起来表示 16(这里要用到十六进制) 个点。
下面只详细罗列出第一段位的对应情况:(其它段都是一样的)

020001 -- P00
020002 -- P01
020003 -- P00 P01
020004 -- P02
020005 -- P00 P02
020006 -- P01 P02
020007 -- P00 P01 P02
020008 -- P03
020009 -- P00 P03
02000A -- P01 P03
02000B -- P00 P01 P03
02000C -- P02 P03
02000D -- P00 P02 P03
02000E -- P01 P02 P03
02000F -- P00 P01 P02 P03

020010 -- P04
020020 -- P05
020030 -- P04 P05
020040 -- P06
020050 -- P04 P06
020060 -- P05 P06
020070 -- P04 P05 P06
020080 -- P07
020090 -- P04 P07
0200A0 -- P05 P07
0200B0 -- P04 P05 P07
0200C0 -- P06 P07
0200D0 -- P04 P06 P07
0200E0 -- P05 P06 P07
0200F0 -- P04 P05 P06 P07

020100 -- P08
020200 -- P09
020300 -- P08 P09
020400 -- P0A
020500 -- P08 P0A
020600 -- P09 P0A
020700 -- P08 P09 P0A
020800 -- P0B
020900 -- P08 P0B
020A00 -- P09 P0B
020B00 -- P08 P09 P0B
020C00 -- P0A P0B
020D00 -- P08 P0A P0B
020E00 -- P09 P0A P0B
020F00 -- P08 P09 P0A P0B

021000 -- P0C
022000 -- P0D
023000 -- P0C P0D
024000 -- P0E
025000 -- P0C P0E
026000 -- P0D P0E
027000 -- P0C P0D P0E
028000 -- P0F
029000 -- P0C P0F
02A000 -- P0D P0F
02B000 -- P0C P0D P0F
02C000 -- P0E POF
02D000 -- P0C P0E POF
02E000 -- P0D P0E POF
02F000 -- P0C P0D P0E POF

以上的对应关系不难看出
02FFFF -- P00 P01 P02 P03 P04 P05 P06 P07 P08 P09 P0A P0B P0C P0D P0E POF
虽然还有N多组合,再一一列出来就显得多余了。


纯手工码字,请大神多多指教。
...全文
212 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xggllc 2014-03-10
  • 打赏
  • 举报
回复
谢谢各位。
引用 2 楼 laq616853363 的回复:
编辑出错,大神请无视那些span标签,但是标签内部别忽略啦~
引用 4 楼 caozhy 的回复:
不就是二进制转换为十进制么,故弄玄虚什么。
引用 3 楼 sp1234 的回复:
首先从16进制字符串转换为int32,然后找一下(通过移位)哪一位为1。 可以写一个console的测试
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new string[] { "0001", "0002", "0004", "0008", "0010", "0020", "0040", "0080", "0100", "0200", "0400", "0800", "1000", "2000", "4000", "8000" };
            foreach (var s in a)
            {
                var i = MyConvert(s);
                Console.WriteLine("{1} -->  {0,2}", "0" + Convert.ToString(i, 16), s);
            }
            Console.ReadKey();
        }

        private static int MyConvert(string input)
        {
            var b = Convert.ToInt32(input, 16);
            var i = 1;
            for (; i < 16; i++)
            {
                b = b >> 1;
                if (b == 0)
                    break;
            }
            return i - 1;
        }
    }

}
Csharp_琪 2014-03-10
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
不就是二进制转换为十进制么,故弄玄虚什么。
我感觉像是十六进制
threenewbee 2014-03-07
  • 打赏
  • 举报
回复
不就是二进制转换为十进制么,故弄玄虚什么。
  • 打赏
  • 举报
回复
首先从16进制字符串转换为int32,然后找一下(通过移位)哪一位为1。 可以写一个console的测试
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new string[] { "0001", "0002", "0004", "0008", "0010", "0020", "0040", "0080", "0100", "0200", "0400", "0800", "1000", "2000", "4000", "8000" };
            foreach (var s in a)
            {
                var i = MyConvert(s);
                Console.WriteLine("{1} -->  {0,2}", "0" + Convert.ToString(i, 16), s);
            }
            Console.ReadKey();
        }

        private static int MyConvert(string input)
        {
            var b = Convert.ToInt32(input, 16);
            var i = 1;
            for (; i < 16; i++)
            {
                b = b >> 1;
                if (b == 0)
                    break;
            }
            return i - 1;
        }
    }

}
Csharp_琪 2014-03-07
  • 打赏
  • 举报
回复
编辑出错,大神请无视那些span标签,但是标签内部别忽略啦~
xggllc 2014-03-07
  • 打赏
  • 举报
回复
忘记了 是代码,不能加颜色 怎么样才能从新编辑一下贴纸啊?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧