2009-11-21 67 views
2

在過去的幾個星期裏,我已閱讀了書籍Error Control Coding: Fundamentals and Applications,以瞭解BCH(Bose,Chaudhuri,Hocquenghem)在電信公司擔任初級編程角色的代碼。Java中的編碼代碼

這本書主要涵蓋的主題背後的數學和理論,但我在努力實現的一些概念;主要是獲得下ñ codewords.I有一個GUI(通過NetBeans的實施,使該文件是巨大的,我不會發布的代碼),爲了獲得下一ñ數通過代碼:

生成這些數字是我遇到問題的地方。如果我可以在編碼方法中通過所有這些,而不是通過使用GUI進行循環,那麼我的生活將會輕鬆十倍。

這已被現在快把我逼瘋了幾天,因爲它是很容易產生從輸入0000000000,但我失去了在何處從那裏我的代碼。然後我會怎樣做才能生成下一個工作號碼?

與生成上述代碼任何幫助,將不勝感激。

+0

如果你把你要使用的算法,它可以幫助。 – 2009-11-21 15:05:08

+0

我已經放入了我正在嘗試使用的代碼。這本書說,要使用上面使用的代碼來獲取四個校驗位,並從任意六位數字中生成接下來的n個代碼字 - 這就是我遇到問題的地方。 – AlexT 2009-11-21 15:16:56

回答

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"); 
    } 
} 

我寧願拋出異常,而不是返回一個特殊的字符串。在這種情況下,我忽略了通常我會說的不好的例外,但對於這種情況,我認爲這是你想要的。

+0

這完全適用於我的例子,但我想生成n個碼字基於任何輸入,而不只是000000我使用的GUI輸入000000,我想進入任何六位數字和編碼。這是可能的,它會需要任何劇烈的變化? – AlexT 2009-11-22 14:19:54

+0

更新的代碼應該做你想做的。現在你可以運行「java Main 111111 10」,它將在111111處開始,然後轉到接下來的10個數字。在你的GUI,你會得到起始值和迭代次數,並將它們與方法的Integer.parseInt轉換(它會拋出一個NumberFormatException如果該字符串不是一個int),然後通過這些方法的encodeAll方法。我也可能會將encodeALl改爲encodeRange或類似的東西。 – TofuBeer 2009-11-22 15:44:50

+0

作品完美,謝謝! – AlexT 2009-11-23 13:47:03

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)

更新

要在當前呼叫時使用,以替代調用此方法的調用來編碼(字符串str)。您將收到包含所有編碼的有序列表。

我已經開始了,你只對八進制數值感興趣 - 我的錯誤,現在我想你只是忘記了在你的例子中對值000009的編碼,從而消除了令人反感的八進制數。

+0

我如何在我現在的代碼中使用它?我無法看到我要通過000000來獲取可用的數字。 – AlexT 2009-11-21 17:46:04