【发布时间】:2015-03-03 11:19:26
【问题描述】:
我正在尝试通过 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++;
}
但是,如何在 C 中将 char 数组转换为整数?
编辑
我尝试了以下方法(反之亦然):
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
【问题讨论】:
-
@AndyThomas:是的,但他正在循环播放
-
你说“我已经尝试了以下”,但你没有说你怎么知道它不起作用。您提供的数组中的值是什么,返回的整数是什么?您是否在调试器中验证了这一点或打印了该值?如果你打印它,你用来打印它的语句是什么?这些信息很重要。这是一个工作示例:ideone.com/EZNCGs
-
@RobotRock:你至少可以打印单个字节吗
-
我正在努力包含松散的字符和预期的输出,我会尽快将它们包括在内。
-
您遇到了符号扩展问题。请参阅我的更新答案。