An algorithm for converting a base-10 number to a base-N number

前端 未结 8 1748
有刺的猬
有刺的猬 2020-12-17 20:37

I am looking for a way to convert a base-10 number into a base-N number where N can be large. Specifically i am looking at converting to base-85 and back again. Does anyone

8条回答
  •  一生所求
    2020-12-17 21:13

    Base 85 is particularly useful for ASCII encoding of binary data, which I presume is what you're using it for. (However, if this is why you should ask yourself whether it's really worth the extra hassle and whether Base 64 won't be good enough.)

    If you're using this as an encoding scheme, your job is going to be to convert integers (4 bytes) into groups of 5 base85 numbers. (How you deal with things that are not multiples of 4 bytes is up to you--usually the end is padded with zeros. See the Wikipedia page on Base 85 for details.)

    The basic algorithm is quite simple: take the remainder on division of 85 when packing into base 85, then divide and repeat, until you're done. To go back again, repeatedly add the value and multiply by 85 until you're done. I'm not terribly familiar with Ruby, so the code here is a C/C++/Javaish style, which hopefully you can interpret:

    // To base 85
    unsigned int n = // your number
    byte b85[5]; // What you want to fill
    for (int i=0 ; i<5 ; i++) {
      b85[4-i] = (n%85);  // Fill backwards to get most significant value at front
      n = n/85;
    }
    
    // From base 85
    n = 0;
    for (int i=0 ; i< 5 ; i++) {
      n = n*85 + b85[i];
    }
    

    This is without worrying about overflow, without worrying about adding 33 to get into ASCII range, and without worrying about the convention that zero is encoded as z not !!!!!, and so on.

提交回复
热议问题