这个问题需要知道你的字节数组是以何种方式存储的!
也就是说,用什么方式传递给 C 语言的程序:是文件?还是网络的Socket.一般情况下,可以在java里面自己写相应的输出方式,例如:/**
 * Write a byte value to OutputStream.
 * @param dos OutputStream
 * @param value the byte value
  */
protected void writeByte (OutputStream os, byte value) throws IOException {
    os.write(value);
}
/**
 * Write a int value to OutputStream.
 * @param dos OutputStream
 * @param value the int value
  */
protected void writeInt (OutputStream os, int value) throws IOException {
    int tmp = ((value >>> 24) & 0xff);
    os.write(tmp);
    tmp = ((value >>> 16) & 0xff);
    os.write(tmp);
    tmp = ((value >>> 8) & 0xff);
    os.write(tmp);
    tmp = (value & 0xff);
    os.write(tmp);
}这样,可以自己根据需要,以特定的字节顺序将数据输出!

解决方案 »

  1.   

    用socket传输的顺序不是问题
    问题是 不知道密钥和加密后的数据以何种方式发送
    c方面是按字节接受 再直接强制类型转换tea算法涉及到的是java中的int与c中的long字节序相反
    关键是在java一方加密时 每8个字节转换成2个int进行加密
    与在c一方加密结果不同
      

  2.   

    void encipher( unsigned long * const v, const unsigned long * const k )
    {
        register unsigned long y = v[0], z = v[1], sum = 0, delta = 0x9E3779B9,
            a = k[0], b = k[1], c = k[2], d = k[3], n = 32;    while ( n-- > 0 )
        {
            sum += delta;
            y += ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
            z += ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
        }
        v[0] = y;
        v[1] = z;
    }void decipher( unsigned long * const v, const unsigned long * const k )
    {
        register unsigned long y = v[0], z = v[1], sum = 0xC6EF3720, delta = 0x9E3779B9,
            a = k[0], b = k[1], c = k[2], d = k[3], n = 32;    // sum = delta << 5, in general sum = delta * n
        while ( n-- > 0 )
        {
            z -= ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
            y -= ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
            sum -= delta;
        }
        v[0] = y;
        v[1] = z;
    }
    转换成java很容易
    关键是让两种语言产生的结果一致
      

  3.   

    为了测试,我写了个测试的 main()void encipher( unsigned long * const v, const unsigned long * const k );
    void decipher( unsigned long * const v, const unsigned long * const k );int main(int argc, char* argv[])
    {
        unsigned long v1 [2]  = {100, 100};
        unsigned long k1 [4]  = {100, 200, 300, 400};
        
        unsigned long* const vs = v1;
        const unsigned long* const ks = k1;    encipher(vs, ks);
        printf("%d,  %d  \n", v1 [0] , v1 [1] );    decipher(vs, ks);
        printf("%d,  %d  \n", v1 [0] , v1 [1] );    return 0;
    }
      

  4.   

    对应测试的 java 代码:public class Tea {    public Tea() {
        }    public static void main(String argv[])
        {
            int v1 []  = {100, 100};
            int k1 []  = {100, 200, 300, 400};
            encipher(v1, k1);
            System.out.println(" " + v1 [0] + " " + v1 [1] );        decipher(v1, k1);
            System.out.println(" " + v1 [0] + " " + v1 [1] );
        }
        static void encipher( int [] v, int [] k )
        {
            int y = v[0], z = v[1];
            int sum = 0, delta = 0x9E3779B9;
            int a = k[0], b = k[1], c = k[2], d = k[3], n = 32;        while ( n-- > 0 )
            {
                sum += delta;
                y += ( z << 4 ) + a ^ z + sum ^ ( z >>> 5 ) + b;
                z += ( y << 4 ) + c ^ y + sum ^ ( y >>> 5 ) + d;
            }
            v[0] = y;
            v[1] = z;
        }
        static void decipher( int [] v, int [] k )
        {
            int y = v[0], z = v[1];
            int sum = 0xC6EF3720, delta = 0x9E3779B9;
            int a = k[0], b = k[1], c = k[2], d = k[3], n = 32;
            // sum = delta << 5, in general sum = delta * n
            while ( n-- > 0 )
            {
                z -= ( y << 4 ) + c ^ y + sum ^ ( y >>> 5 ) + d;
                y -= ( z << 4 ) + a ^ z + sum ^ ( z >>> 5 ) + b;
                sum -= delta;
            }
            v[0] = y;
            v[1] = z;
        }}
      

  5.   

    主要的修改是  把 C中的 >>  转换为 Java 中的 >>> java 中 >> 是带符号的右移, >>> 是无符号的右移