通过TCP将Java int发送到C

时间:2015-01-05 20:51:07

标签: java c tcp

我试图通过TCP将Java签名的整数发送给C客户端。

在Java端,我将整数写入输出流,如下所示:

static ByteBuffer wrapped = ByteBuffer.allocateDirect(4); // big-endian by default

public static void putInt(OutputStream out, int nr) throws IOException {
    wrapped.rewind();
    wrapped.putInt(nr);
    wrapped.rewind();

    for (int i = 0; i < 4; i++)
        out.write(wrapped.get());
}

在C方面,我读了这样的整数:

int cnt = 0;
char buf[1];
char sizebuf[4];
while(cnt < 4) {
      iResult = recv(ConnectSocket, buf, 1, 0);
      if (iResult <= 0) continue;

      sizebuf[cnt] = buf[0];
      cnt++;
}

但是,如何将char数组转换为C中的整数?

修改

我尝试了以下(反过来):

int charsToInt(char* array) {
     return (array[3] << 24) | (array[2] << 16) | (array[1] << 8) | array[0];   
}

再次编辑,因为我忘记了标签。

数据

例如目前发生的事情:

我收到:

char 0
char 0
char 12
char -64
the int becomes 2448

并使用该函数从char数组创建int:

int charsToInt(char* array) {
    return ntohl(*((int*) array)); 
}

我希望有符号整数:3264

更新 一些睡眠后我会调查更多..

更新 我有一个Java客户端,它正确解释整数并接收完全相同的字节:

0
0
12
-64

3 个答案:

答案 0 :(得分:1)

这取决于字节顺序,但你要么:

 int x = sizebuf[0] + 
         (sizebuf[1] << 8) +
         (sizebuf[2] << 16) +
         (sizebuf[3] << 24);

或:

 int x = sizebuf[3] + 
         (sizebuf[2] << 8) +
         (sizebuf[1] << 16) +
         (sizebuf[0] << 24);

请注意,sizebuf需要使用无符号类型才能正常工作。否则,您需要屏蔽掉您不想要的任何符号扩展值:

 int x = (sizebuf[3] & 0x000000ff) + 
         ((sizebuf[2] << 8) & 0x0000ff00) +
         ((sizebuf[1] << 16) & 0x00ff0000) +
         ((sizebuf[0] << 24) & 0xff000000);

答案 1 :(得分:1)

经典的C库有你想要的方法,它独立于机器的字节序:ntohl

// buf is a char */uint8_t *
uint32_t from_network = *((uint32_t *) buf);
uint32_t ret = ntohl(from_network);

这和反向等htonl期望“网络订单”是大端。

(上面的代码预先假定buf至少有4个字节; ntohlhtonl的返回类型和参数类型是uint32_t; JLS定义int为4个字节,因此可以保证结果)

答案 2 :(得分:0)

要转换为char数组,一种可能性是将其转换为int *并存储结果:

int result = *((int*) sizebuf)

这是有效且一行。其他可能性是从字符计算整数。

for (i = 0 ; i < 4; i++) 
     result = result << sizeof(char) + buf[0]

选择您喜欢的那个。

亚历。

编辑: sizeof(char)是1,因为sizeof返回Byte结果。所以右边是: 结果=结果&lt;&lt; (sizeof(char)* 8)+ buf [0]