2

ここ数週間、通信会社でジュニア プログラミングの役割を担う BCH (Bose、Chaudhuri、Hocquenghem) コードについて学ぶために、「 Error Control Coding: Fundamentals and Applications 」という本を読みました。

この本は主に主題の背後にある数学と理論をカバーしていますが、いくつかの概念を実装するのに苦労しています。主に次のnコードワードを取得します。次のn番号を取得するためにコードを渡す GUI があります (NetBeans を介して実装されているため、ファイルが巨大なのでコードは掲載しません) 。

これらの数値を生成することは、私が問題を抱えているところです。GUI を使用してループするのではなく、エンコード方法だけでこれらすべてを実行できれば、私の人生は 10 倍楽になるでしょう。

入力から 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;
}

ソリューションには 1 つの欠陥があります。toOctalString の結果は 0 で埋められません。String.format("<something>", i)それが必要な場合は、エンコーディング呼び出しで使用することをお勧めします。

アップデート

現在の呼び出しで使用するには、encoding(String str) への呼び出しをこのメソッドへの呼び出しに置き換えます。すべてのエンコーディングを含む順序付きリストを受け取ります。

私は、あなたは8進数の値にのみ興味があると思いました-私の間違いです。あなたの例で値000009のエンコーディングを忘れてしまったので、8進数のものを削除したと思います。

于 2009-11-21T16:42:01.233 に答える