1

Java を実行している別のマシンとやり取りするプログラムを作成しており、ネットワーク経由で文字配列を送信する必要があります。受信側では、Java プログラムは DataInputStream の readChar() 関数を使用し、文字を想定します。ただ、Cでは文字が1バイトで格納されるので、ネットワークへの書き込みに苦労しています。

これを変換するにはどうすればよいですか?

実際のプロトコル仕様は次のようになります。

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の受信側でテストしましたが、短いものは正しい長さで正しく送信されますが、文字配列は送信されません。

前もって感謝します!

4

2 に答える 2

1

それを行うには多くの方法があります。あなたがしたいことは、すべてのデータを含むバッファを構築し、それをsend(2)システムコールに渡してソケットに沿って送信することです。

データのワイヤ形式はビッグ エンディアン (別名ネットワーク バイト オーダー) であるため、最初に最上位バイトで値を保存するようにしてください。ローカル システムのエンディアンの問題を回避するために、手動でバイト バッファーを作成することをお勧めします (「バイト オーダーの誤謬」も参照)。

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);
于 2013-08-23T05:19:56.423 に答える
0

基本 ASCII 文字 (特殊文字なし) を変換するだけで十分だったので、UTF16 でデータを送信するための簡単なソリューションをまとめました。

char *GetBytesString(char message[])
{
    short str_len = strlen(message);
    char *ptr = (char *) malloc(str_len * 2);
    int i;
    for (i = 0; i < str_len; i++)
    {
        int pos = i * 2;
        if (message[i] == '#')
        {
            ptr[pos] = 0;
            ptr[pos + 1] = 0;
        }
        else
        {
            ptr[pos] = 0;
            ptr[pos + 1] = message[i];
        }
    }
    return ptr;
}

パイプを介してヌル ターミネータを送信できるようにする必要があったため、# をヌル文字に変換して、strlen が正確な長さを返せるようにします。

于 2013-08-29T07:47:15.740 に答える