2013-04-23 2 views
0

한 슬롯에 96 개의 다른 문자를 사용할 수있는 Code128 바코드에 대한 정보를 인코딩하고 싶습니다. 따라서 95 십진수는 101 1111b96에서 1 000 0000b으로 변환됩니다.숫자를 최대 96 상태의 7 비트 단어로 변환

이제 10 진수 (또는 2 진수)를 최대 96 상태의 7 비트 단어로 변환하는 알고리즘이 필요합니다. 나는 오늘 아침에 그 알고리즘을 (비트 쉬프트와 로그를 가지고 놀면서) 계산하려고 노력했지만, 여기서 중요한 점을 놓치고있는 것 같다.

예를 들어 537 (10 0001 1001b)을 어떻게 번역합니까?

답변

0

숫자를 조금씩 재생 한 후에 마침내 해결책을 찾았습니다. 883.736의 경우 :

883.736/96 = 9.205 R: 56 
    9.205/96 = 95 R: 85 
    95/96 =  0 R: 95 

해당 숫자는 7 비트 단어로 변환 할 수 있습니다. 원래의 값을 얻기 위해 :

public static class Base96 
{ 
    private const int BASE = 96; 

    public static byte[] Encode(int number) 
    { 
    var list = new List<Byte>(); 

    do 
    { 
     list.Add((byte)(number % BASE)); 
    } 
    while ((number = (number/BASE)) > 0); 

    return list.ToArray(); 
    } 

    public static int Decode(byte[] words) 
    { 
    int result = 0; 

    for (int i = 0; i < words.Length; i++) 
    { 
     result += (words[i] * (int)Math.Pow(BASE, i)); 
    } 

    return result; 
    } 

} 

부르는 등 :

var encoded = Base96.Encode(883736); 
var decoded = Base96.Decode(encoded); 

883.736 = 56 * 96^0 + 85 * 96^1 + 95 * 96^2 
알고리즘 C 번호 (리틀 엔디안)로 표현