[java] String to long[] and back

Started by
2 comments, last by kooktroop 18 years, 7 months ago
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.
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 = (<span class="java-primitives">byte</span>)( source &amp; 0xFF );
                bytes = (<span class="java-primitives">byte</span>)( ( source &amp;gt;&amp;gt; <span class="java-number">8</span> ) &amp; 0xFF );
                bytes = (<span class="java-primitives">byte</span>)( ( source &amp;gt;&amp;gt; <span class="java-number">16</span> ) &amp; 0xFF );
                bytes = (<span class="java-primitives">byte</span>)( ( source &amp;gt;&amp;gt; <span class="java-number">24</span> ) &amp; 0xFF );
                bytes = (<span class="java-primitives">byte</span>)( ( source &amp;gt;&amp;gt; <span class="java-number">32</span> ) &amp; 0xFF );
                bytes = (<span class="java-primitives">byte</span>)( ( source &amp;gt;&amp;gt; <span class="java-number">40</span> ) &amp; 0xFF );
                bytes = (<span class="java-primitives">byte</span>)( ( source &amp;gt;&amp;gt; <span class="java-number">48</span> ) &amp; 0xFF );
                bytes = (<span class="java-primitives">byte</span>)( ( source &amp;gt;&amp;gt; <span class="java-number">56</span> ) &amp; 0xFF );
            }
            
            <span class="java-keyword">return</span> <span class="java-keyword">new</span> String( bytes );
        }
        
        <span class="java-visibilitymodifier">public</span> <span class="java-storageclasses">static</span> <span class="java-primitives">long</span>[] stringToLong( String str )
        {
            <span class="java-primitives">int</span> needsPadding = <span class="java-number">8</span> - ( str.length() % <span class="java-number">8</span> );
            
            <span class="java-keyword">while</span> ( needsPadding &amp;gt; <span class="java-number">0</span> )
            {
                <span class="java-comment">//System.out.println( "adding padding:" + needsPadding );</span>
                needsPadding–;
                str += ' ';
            }
            
            <span class="java-primitives">byte</span>[] bytes = str.getBytes();
            <span class="java-primitives">int</span> lengthInLong = bytes.length / <span class="java-number">8</span>; 
            <span class="java-primitives">long</span>[] ret = <span class="java-keyword">new</span> <span class="java-primitives">long</span>[ lengthInLong ];
           
            <span class="java-primitives">int</span> b = <span class="java-number">0</span>;
            
            System.out.println( <span class="java-literal">"length:"</span>+lengthInLong+<span class="java-literal">" str:'"</span>+str+<span class="java-literal">"' bytes length:"</span>+ bytes.length+<span class="java-literal">" strlength:"</span>+str.length() );
            <span class="java-keyword">for</span> ( <span class="java-primitives">int</span> i = <span class="java-number">0</span>; i &amp;lt; lengthInLong; i++, b+= <span class="java-number">8</span> )
            {
                System.out.println( <span class="java-literal">"i:"</span>+i);
                ret = bytes + ( bytes &amp;lt;&amp;lt; <span class="java-number">8</span> ) + ( bytes &amp;lt;&amp;lt; <span class="java-number">16</span> ) + ( bytes &amp;lt;&amp;lt; <span class="java-number">24</span> ) + ( bytes &amp;lt;&amp;lt; <span class="java-number">32</span> ) 
                            + ( bytes &amp;lt;&amp;lt; <span class="java-number">40</span> ) + ( bytes &amp;lt;&amp;lt; <span class="java-number">48</span> ) + ( bytes &amp;lt;&amp;lt; <span class="java-number">56</span> );
            }
            
            <span class="java-keyword">return</span> ret;
        }  
</pre></div><!–ENDSCRIPT–>

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).
<!–STARTSCRIPT–><!–source lang="java"–><div class="source"><pre>
        <span class="java-comment">/**
         * Converts an array of longs into a string
         *
         * @param source The long's to convert into a string
         *
         * @return The longs in string form
         */</span>
        <span class="java-visibilitymodifier">public</span> <span class="java-storageclasses">static</span> String longToString( <span class="java-primitives">long</span>[] source )
        {
            StringBuffer ret = <span class="java-keyword">new</span> StringBuffer();
            <span class="java-keyword">for</span> ( <span class="java-primitives">int</span> i = <span class="java-number">0</span>; i &amp;lt; source.length; i++ )
            {
                ret.append( (<span class="java-primitives">char</span>)( source &amp; 0xFF ) );
                ret.append( (<span class="java-primitives">char</span>)( ( source &amp;gt;&amp;gt;&amp;gt; <span class="java-number">8</span> ) &amp; 0xFF ) );
                ret.append( (<span class="java-primitives">char</span>)( ( source &amp;gt;&amp;gt;&amp;gt; <span class="java-number">16</span> ) &amp; 0xFF ) );
                ret.append( (<span class="java-primitives">char</span>)( ( source &amp;gt;&amp;gt;&amp;gt; <span class="java-number">24</span> ) &amp; 0xFF ) );
            }
            
            <span class="java-keyword">return</span> ret.toString();
        }
        
        <span class="java-comment">/**
         * Converts a string into an array of longs
         *
         * @param str The string to be converted
         *
         * @return An array of longs created from the string.
         */</span>
        <span class="java-visibilitymodifier">public</span> <span class="java-storageclasses">static</span> <span class="java-primitives">long</span>[] stringToLong( String str )
        {
            <span class="java-primitives">int</span> needsPadding = str.length() % <span class="java-number">4</span>;
            <span class="java-keyword">while</span> ( needsPadding &amp;gt; <span class="java-number">0</span> )
            {
                needsPadding–;
                str += ' ';
            }
            <span class="java-primitives">int</span> lengthInLong = str.length() / <span class="java-number">4</span>;
            <span class="java-primitives">long</span>[] ret = <span class="java-keyword">new</span> <span class="java-primitives">long</span>[ lengthInLong ];
            
            <span class="java-keyword">for</span> ( <span class="java-primitives">int</span> i = <span class="java-number">0</span>; i &amp;lt; lengthInLong; i++ )
            {
                ret = str.charAt( i &amp;lt;&amp;lt; <span class="java-number">2</span> ) + ( str.charAt( (i &amp;lt;&amp;lt; <span class="java-number">2</span>) + <span class="java-number">1</span> ) &amp;lt;&amp;lt; <span class="java-number">8</span> ) + ( str.charAt( (i &amp;lt;&amp;lt; <span class="java-number">2</span>) + <span class="java-number">2</span> ) &amp;lt;&amp;lt; <span class="java-number">16</span> ) + ( str.charAt( (i &amp;lt;&amp;lt; <span class="java-number">2</span>) + <span class="java-number">3</span> ) &amp;lt;&amp;lt; <span class="java-number">24</span> );
            }
            
            <span class="java-keyword">return</span> ret;
        }

</pre></div><!–ENDSCRIPT–> 

Any help, or suggestions &#111;n how to do this would be greatly appreciated!

Thanks in advance.
Do not remove a fly from your friend's forehead with a hatchet.Chinese Proverb
Advertisement
What exactly are you trying to do? Give an example of some input and output expected.

If you're trying to do what i'm thinking, I see no need for all that code.
- blew
Couldn't you just loop through the characters in the string and cast its value to a long, then put it in the array of longs?

ace
I could, but im working with j2me and that would take up excess memory, never mind i ended up not needing this code.
Do not remove a fly from your friend's forehead with a hatchet.Chinese Proverb

This topic is closed to new replies.

Advertisement