2

在过去的几周里,我通读了《错误控制编码:基础和应用》一书,以了解 BCH(Bose、Chaudhuri、Hocquenghem)代码,以便在一家电信公司担任初级编程角色。

这本书主要涵盖了该主题背后的数学和理论,但我正在努力实现一些概念;主要是获取接下来的n 个代码字。我有一个 GUI(通过 NetBeans 实现,所以我不会发布代码,因为文件很大)传递代码以获得接下来的n 个数字:

生成这些数字是我遇到问题的地方。如果我可以仅在编码方法中完成所有这些,而不是使用 GUI 循环,我的生活会轻松十倍。

这已经让我发疯了好几天,因为从输入中生成 0000000000 很容易,但是我不知道从那里用我的代码去哪里。然后我该怎么做才能生成下一个工作号码?

任何有关生成上述代码的帮助将不胜感激。

4

2 回答 2

2

(大编辑......)更多地使用代码,这似乎有效:

import java.util.ArrayList;
import java.util.List;


public class Main
{
    public static void main(final String[] argv)
    {
        final int startValue;
        final int iterations;
        final List<String> list;

        startValue = Integer.parseInt(argv[0]);
        iterations = Integer.parseInt(argv[1]);
        list = encodeAll(startValue, iterations);
        System.out.println(list);
    }

    private static List<String> encodeAll(final int startValue, final int iterations)
    {
        final List<String> allEncodings;

        allEncodings = new ArrayList<String>();

        for(int i = 0; i < iterations; i++)
        {
            try
            {
                final int    value;
                final String str;
                final String encoding;

                value = i + startValue;
                str = String.format("%06d", value);
                encoding = encoding(str);
                allEncodings.add(encoding);
            }
            catch(final BadNumberException ex)
            {
                // do nothing
            }
        }

        return allEncodings;
    }

    public static String encoding(String str)
        throws BadNumberException
    {
        final int[]         digit;
        final StringBuilder s;

        digit = new int[10];

        for(int i = 0; i < 6; i++)
        {
            digit[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
        }

        digit[6] = ((4*digit[0])+(10*digit[1])+(9*digit[2])+(2*digit[3])+(digit[4])+(7*digit[5])) % 11;
        digit[7] = ((7*digit[0])+(8*digit[1])+(7*digit[2])+(digit[3])+(9*digit[4])+(6*digit[5])) % 11;
        digit[8] = ((9*digit[0])+(digit[1])+(7*digit[2])+(8*digit[3])+(7*digit[4])+(7*digit[5])) % 11;
        digit[9] = ((digit[0])+(2*digit[1])+(9*digit[2])+(10*digit[3])+(4*digit[4])+(digit[5])) % 11;

        // Insert Parity Checking method (Vandermonde Matrix)
        s = new StringBuilder();

        for(int i = 0; i < 9; i++)
        {
            s.append(Integer.toString(digit[i]));
        }

        if(digit[6] == 10 || digit[7] == 10 || digit[8] == 10 || digit[9] == 10)
        {
            throw new BadNumberException(str);
        }

        return (s.toString());
    }
}

class BadNumberException
    extends Exception
{
    public BadNumberException(final String str)
    {
        super(str + " cannot be encoded");
    }
}

我更喜欢抛出异常而不是返回一个特殊的字符串。在这种情况下,我忽略了通常我会说是不好的做法的异常,但对于这种情况,我认为这是你想要的。

于 2009-11-21T18:33:59.387 回答
1

很难说,如果我遇到了您的问题,但是在多次阅读您的问题之后,也许这就是您要寻找的:

public List<String> encodeAll() {
  List<String> allEncodings = new ArrayList<String>();
  for (int i = 0; i < 1000000 ; i++) { 
    String encoding = encoding(Integer.toString(i));
    allEncodings.add(encoding);
  }
  return allEncodings;
}

解决方案有一个缺陷,toOctalString 结果不是 0 填充的。如果这就是你想要的,我建议String.format("<something>", i)在编码调用中使用。

更新

要在当前调用中使用它,请将对 encoding(String str) 的调用替换为对此方法的调用。您将收到一个包含所有编码的有序列表。

我aasumed,您只对八进制值感兴趣-我的错误,现在我认为您只是忘记了示例中值 000009 的编码,因此删除了令人讨厌的八进制内容。

于 2009-11-21T16:42:01.233 回答