Changeset 1223


Ignore:
Timestamp:
08/04/06 08:26:16 (14 years ago)
Author:
melissa
Message:

added method to encode Base64 data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/Compression.java

    r1124 r1223  
    6060 
    6161  private static byte[] base64Alphabet = new byte[255]; 
     62  private static byte[] lookupBase64Alphabet = new byte[255]; 
    6263 
    6364  static { 
     
    7778    base64Alphabet['+'] = 62; 
    7879    base64Alphabet['/'] = 63; 
     80 
     81    for (int i=0; i<=25; i++) { 
     82      lookupBase64Alphabet[i] = (byte) ('A' + i); 
     83    } 
     84 
     85    for (int i=26, j=0; i<=51; i++, j++) { 
     86      lookupBase64Alphabet[i] = (byte) ('a' + j); 
     87    } 
     88 
     89    for (int i=52, j=0; i<=61; i++, j++) { 
     90      lookupBase64Alphabet[i] = (byte) ('0' + j); 
     91    } 
     92 
     93    lookupBase64Alphabet[62] = (byte) '+'; 
     94    lookupBase64Alphabet[63] = (byte) '/'; 
    7995  } 
    8096 
     
    130146  } 
    131147 
     148  /** 
     149   * Encodes a byte array using Base64 encoding. 
     150   * Much of this code was adapted from the Apache Commons Codec source. 
     151   */ 
     152  public static byte[] base64Encode(byte[] input) { 
     153    int dataBits = input.length * 8; 
     154    int fewerThan24 = dataBits % 24; 
     155    int numTriples = dataBits / 24; 
     156    byte[] encoded = null; 
     157    int encodedLength = 0; 
     158 
     159    if (fewerThan24 != 0) encodedLength = (numTriples + 1) * 4; 
     160    else encodedLength = numTriples * 4; 
     161 
     162    encoded = new byte[encodedLength]; 
     163 
     164    byte k, l, b1, b2, b3; 
     165 
     166    int encodedIndex = 0; 
     167    int dataIndex = 0; 
     168 
     169    for (int i=0; i<numTriples; i++) { 
     170      dataIndex = i * 3; 
     171      b1 = input[dataIndex]; 
     172      b2 = input[dataIndex + 1]; 
     173      b3 = input[dataIndex + 2]; 
     174 
     175      l = (byte) (b2 & 0x0f); 
     176      k = (byte) (b1 & 0x03); 
     177 
     178      byte v1 = ((b1 & -128) == 0) ? (byte) (b1 >> 2) : 
     179        (byte) ((b1) >> 2 ^ 0xc0); 
     180      byte v2 = ((b2 & -128) == 0) ? (byte) (b2 >> 4) : 
     181        (byte) ((b2) >> 4 ^ 0xf0); 
     182      byte v3 = ((b3 & -128) == 0) ? (byte) (b3 >> 6) : 
     183        (byte) ((b3) >> 6 ^ 0xfc); 
     184 
     185      encoded[encodedIndex] = lookupBase64Alphabet[v1]; 
     186      encoded[encodedIndex + 1] = lookupBase64Alphabet[v2 | (k << 4)]; 
     187      encoded[encodedIndex + 2] = lookupBase64Alphabet[(l << 2) | v3]; 
     188      encoded[encodedIndex + 3] = lookupBase64Alphabet[b3 & 0x3f]; 
     189      encodedIndex += 4; 
     190    } 
     191 
     192    dataIndex = numTriples * 3; 
     193 
     194    if (fewerThan24 == 8) { 
     195      b1 = input[dataIndex]; 
     196      k = (byte) (b1 & 0x03); 
     197      byte v = ((b1 & -128) == 0) ? (byte) (b1 >> 2) : 
     198        (byte) ((b1) >> 2 ^ 0xc0); 
     199      encoded[encodedIndex] = lookupBase64Alphabet[v]; 
     200      encoded[encodedIndex + 1] = lookupBase64Alphabet[k << 4]; 
     201      encoded[encodedIndex + 2] = (byte) '='; 
     202      encoded[encodedIndex + 3] = (byte) '='; 
     203    } 
     204    else if (fewerThan24 == 16) { 
     205      b1 = input[dataIndex]; 
     206      b2 = input[dataIndex + 1]; 
     207      l = (byte) (b2 & 0x0f); 
     208      k = (byte) (b1 & 0x03); 
     209 
     210      byte v1 = ((b1 & -128) == 0) ? (byte) (b1 >> 2) : 
     211        (byte) ((b1) >> 2 ^ 0xc0); 
     212      byte v2 = ((b2 & -128) == 0) ? (byte) (b2 >> 4) : 
     213        (byte) ((b2) >> 4 ^ 0xf0); 
     214 
     215      encoded[encodedIndex] = lookupBase64Alphabet[v1]; 
     216      encoded[encodedIndex + 1] = lookupBase64Alphabet[v2 | (k << 4)]; 
     217      encoded[encodedIndex + 2] = lookupBase64Alphabet[l << 2]; 
     218      encoded[encodedIndex + 3] = (byte) '='; 
     219    } 
     220 
     221    return encoded; 
     222  } 
    132223 
    133224  // -- Decompression methods -- 
Note: See TracChangeset for help on using the changeset viewer.