Original Post
Hi, I'm looking to convert a String to an array of longs and back again. The following code has been tried, but doesnt work correctly. Also, ive used a different way of doing things, however this doesnt work correctly when some of the longs become negative (due to encryption and the like). Any help, or suggestions on how to do this would be greatly appreciated! Thanks in advance.
public static String longToString( long[] source )
{
byte[] bytes = new byte[ source.length * 8 ];
int b = 0;
for ( int i = 0; i < source.length; i++, b += 8 )
{
bytes[ b ] = (byte)( source[ i ] & 0xFF );
bytes[ b + 1 ] = (byte)( ( source[ i ] >> 8 ) & 0xFF );
bytes[ b + 2 ] = (byte)( ( source[ i ] >> 16 ) & 0xFF );
bytes[ b + 3 ] = (byte)( ( source[ i ] >> 24 ) & 0xFF );
bytes[ b + 4 ] = (byte)( ( source[ i ] >> 32 ) & 0xFF );
bytes[ b + 5 ] = (byte)( ( source[ i ] >> 40 ) & 0xFF );
bytes[ b + 6 ] = (byte)( ( source[ i ] >> 48 ) & 0xFF );
bytes[ b + 7 ] = (byte)( ( source[ i ] >> 56 ) & 0xFF );
}
return new String( bytes );
}
public static long[] stringToLong( String str )
{
int needsPadding = 8 - ( str.length() % 8 );
while ( needsPadding > 0 )
{
//System.out.println( "adding padding:" + needsPadding );
needsPadding--;
str += ' ';
}
byte[] bytes = str.getBytes();
int lengthInLong = bytes.length / 8;
long[] ret = new long[ lengthInLong ];
int b = 0;
System.out.println( "length:"+lengthInLong+" str:'"+str+"' bytes length:"+ bytes.length+" strlength:"+str.length() );
for ( int i = 0; i < lengthInLong; i++, b+= 8 )
{
System.out.println( "i:"+i);
ret[ i ] = bytes[ b ] + ( bytes[ b + 1 ] << 8 ) + ( bytes[ b + 2 ] << 16 ) + ( bytes[ b + 3 ] << 24 ) + ( bytes[ b + 4 ] << 32 )
+ ( bytes[ b + 5 ] << 40 ) + ( bytes[ b + 6 ] << 48 ) + ( bytes[ b + 7 ] << 56 );
}
return ret;
}
/**
* Converts an array of longs into a string
*
* @param source The long's to convert into a string
*
* @return The longs in string form
*/
public static String longToString( long[] source )
{
StringBuffer ret = new StringBuffer();
for ( int i = 0; i < source.length; i++ )
{
ret.append( (char)( source[ i ] & 0xFF ) );
ret.append( (char)( ( source[ i ] >>> 8 ) & 0xFF ) );
ret.append( (char)( ( source[ i ] >>> 16 ) & 0xFF ) );
ret.append( (char)( ( source[ i ] >>> 24 ) & 0xFF ) );
}
return ret.toString();
}
/**
* Converts a string into an array of longs
*
* @param str The string to be converted
*
* @return An array of longs created from the string.
*/
public static long[] stringToLong( String str )
{
int needsPadding = str.length() % 4;
while ( needsPadding > 0 )
{
needsPadding--;
str += ' ';
}
int lengthInLong = str.length() / 4;
long[] ret = new long[ lengthInLong ];
for ( int i = 0; i < lengthInLong; i++ )
{
ret[ i ] = str.charAt( i << 2 ) + ( str.charAt( (i << 2) + 1 ) << 8 ) + ( str.charAt( (i << 2) + 2 ) << 16 ) + ( str.charAt( (i << 2) + 3 ) << 24 );
}
return ret;
}