java - 将 C 字符转换为 UTF-16 以便通过网络传输

标签 java c networking

我正在编写一个与另一台运行 Java 的机器交互的程序,我需要通过网络发送字符数组。在接收端,Java 程序使用 DataInputStream 的 readChar() 函数并需要字符。但是,由于字符在 C 中存储为 1 个字节,因此我在写入网络时遇到了一些问题。

我将如何转换它?

实际的协议(protocol)规范是这样的:

short: Contains length of char array
char 1, 2, 3...: The characters in the array

背景资料,我的简短转换是这样的:

char *GetBytesShort(short data)
{
    short net_data = NET_htons(data);
    char *ptr = (char *) malloc(sizeof(short));
    memcpy(ptr, &net_data, sizeof(short));
    return ptr;
}

我已经用 Java 在接收端对其进行了测试,短消息确实以正确的长度正确发送,但字符数组却没有。

提前致谢!

最佳答案

有很多方法可以做到这一点。你想要做的是构建一个包含所有数据的缓冲区,然后将其传递到 send(2)系统调用以通过套接字发送它。

数据的传输格式是大端字节序(又名网络字节顺序),因此您应该确保先存储最高有效字节的值。我建议仅手动构建字节缓冲区以避免本地系统的字节顺序问题(另请参阅 The byte order fallacy ),例如:

uint16_t dataLen = ...;  // Length of data, in characters
uint16_t *charData = ...;  // Character array

// Constructor packet data buffer to send.  Error checking omitted for
// expository purposes.
size_t packetSize = 2 + dataLen * 2;
uint8_t *packet = malloc(packetSize);

// Copy length into buffer, big-endian
packet[0] = (uint8_t)(dataLen >> 8);
packet[1] = (uint8_t)(dataLen & 0xFF);

// Copy each character into the buffer, big-endian
for (uint16_t i = 0; i < dataLen; i++)
{
    packet[2 + 2*i]     = (uint8_t)(charData[i] >> 8);
    packet[2 + 2*i + 1] = (uint8_t)(charData[i] & 0xFF);
}

// We're done -- send the packet
send(sockfd, packet, packetSize, 0);

关于java - 将 C 字符转换为 UTF-16 以便通过网络传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18394925/

相关文章:

java - Eclipse Web 服务资源管理器如何工作?

c - 龟兔赛跑,指针示例 C

c - Arduino:函数错误的重新定义

networking - OPC 与 SNMP 协议(protocol)

java - 读取int数组并检查它是否已排序

java - 如何比较从Web服务中提取的3个变量(equalsIgnoreCase)?

c - 当涉及功能时,结构、 union 等的范围如何工作?

networking - Bellman Ford 和 Dijkstra 算法之间的区别

cocoa - cocoa 中的客户端到客户端消息传递?

java - hibernate 检索查询不起作用