socket编程中的Huffman编码

socket编程中的Huffman编码,c,sockets,huffman-code,bit-fields,C,Sockets,Huffman Code,Bit Fields,我想在用C编写的客户机-服务器套接字程序中使用哈夫曼代码 因此,我编写了一段代码,用于从文本文件中生成哈夫曼树作为输入。但是,我不知道如何在客户机-服务器套接字程序中使用它。 到目前为止,我已经考虑了以下方法-- 1) 通过套接字连接以位的形式发送编码文件。不能这样做,因为我使用的是C语言,并且没有位数据类型(我怀疑在任何语言中都没有位数据类型)。 2) 以整数0s和1s的形式发送数据。这将完全违背目的。字符(1字节)Int(至少4字节)您必须自己将位打包成字节。这不是C语言特有的-很少有语言具

我想在用C编写的客户机-服务器套接字程序中使用哈夫曼代码

因此,我编写了一段代码,用于从文本文件中生成哈夫曼树作为输入。
但是,我不知道如何在客户机-服务器套接字程序中使用它。
到目前为止,我已经考虑了以下方法--

1) 通过套接字连接以位的形式发送编码文件。不能这样做,因为我使用的是C语言,并且没有位数据类型(我怀疑在任何语言中都没有位数据类型)。

2) 以整数0s和1s的形式发送数据。这将完全违背目的。字符(1字节)Int(至少4字节)

您必须自己将位打包成字节。这不是C语言特有的-很少有语言具有位数据类型

您需要“保存”8位,然后将其转换为一个字节,然后发送该字节。大致如下:

int bitBuffer = 0;
int numberOfSavedBits = 0;

// bit must be 1 or 0
void sendBit(int bit) {
    bitBuffer |= (bit << numberOfSavedBits);
    numberOfSavedBits++;
    if (numberOfSavedBits == 8) {
        sendByte(bitBuffer);
        numberOfSavedBits = 0;
        bitBuffer = 0;
    }
}
int encodedValues[1024];
...
// set encodedValues
...
char packedValues[128] = {0};
int i;
for (i=0; i<1024; i++) {
    if (encodedValues[i]) {
        packedValues[i/8] |= (1 << (i % 8));
    }
}
int-bitBuffer=0;
int numberOfSavedBits=0;
//位必须为1或0
无效发送位(整数位){

bitBuffer |=(位您必须自己将位打包成字节。这不是C语言特有的-很少有语言具有位数据类型

您需要“保存”8位,然后将其转换为一个字节,然后发送该字节。大致如下:

int bitBuffer = 0;
int numberOfSavedBits = 0;

// bit must be 1 or 0
void sendBit(int bit) {
    bitBuffer |= (bit << numberOfSavedBits);
    numberOfSavedBits++;
    if (numberOfSavedBits == 8) {
        sendByte(bitBuffer);
        numberOfSavedBits = 0;
        bitBuffer = 0;
    }
}
int encodedValues[1024];
...
// set encodedValues
...
char packedValues[128] = {0};
int i;
for (i=0; i<1024; i++) {
    if (encodedValues[i]) {
        packedValues[i/8] |= (1 << (i % 8));
    }
}
int-bitBuffer=0;
int numberOfSavedBits=0;
//位必须为1或0
无效发送位(整数位){

bitBuffer |=(bit只需将位打包成字节,即可完成。通过使用逐位运算符,这是一项非常简单的任务。例如

uint32_t value = 0;

value |= 1 << 3; // set fourth bit to one
bool isFourthBitSet = value & (1 << 4); // check if fifth bit is set

使所有这些操作对用户透明。当然,您必须确保客户端和套接字使用相同的内存布局。此外,如果要打包到大于1字节的单元中,则还必须确保相同的endianness。

只需将位打包到字节中,就可以完成。使用逐位运算符,这是一项非常简单的任务.例如

uint32_t value = 0;

value |= 1 << 3; // set fourth bit to one
bool isFourthBitSet = value & (1 << 4); // check if fifth bit is set

使所有这些操作对用户透明。当然,您必须确保客户端和套接字使用相同的内存布局。此外,如果要打包成大于1字节的单元,则还必须确保相同的尾数。

您需要将
0
1
值打包到
ch的位中ar
阵列

例如,假设您有以下16个
int
值的数组:

  [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9] [10] [11] [12] [13] [14] [15] 
---------------------------------------------------------------------------------
|  0 |  1 |  0 |  1 |  1 |  1 |  0 |  1 |  0 |  0 |  1 |  0 |  0 |  0 |  1 |  1 |
---------------------------------------------------------------------------------
您可以使用以下二进制格式将其压缩为2个
char
值:

    [0]        [1]
-----------------------
| 01011101 | 00100011 |
-----------------------
在发送方,您可以这样打包位:

int bitBuffer = 0;
int numberOfSavedBits = 0;

// bit must be 1 or 0
void sendBit(int bit) {
    bitBuffer |= (bit << numberOfSavedBits);
    numberOfSavedBits++;
    if (numberOfSavedBits == 8) {
        sendByte(bitBuffer);
        numberOfSavedBits = 0;
        bitBuffer = 0;
    }
}
int encodedValues[1024];
...
// set encodedValues
...
char packedValues[128] = {0};
int i;
for (i=0; i<1024; i++) {
    if (encodedValues[i]) {
        packedValues[i/8] |= (1 << (i % 8));
    }
}
int-encodedValues[1024];
...
//设置编码值
...
char packedValue[128]={0};
int i;

对于(i=0;i您需要获取
0
1
值,并将它们打包到
char
数组的位中

例如,假设您有以下16个
int
值的数组:

  [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9] [10] [11] [12] [13] [14] [15] 
---------------------------------------------------------------------------------
|  0 |  1 |  0 |  1 |  1 |  1 |  0 |  1 |  0 |  0 |  1 |  0 |  0 |  0 |  1 |  1 |
---------------------------------------------------------------------------------
您可以使用以下二进制格式将其压缩为2个
char
值:

    [0]        [1]
-----------------------
| 01011101 | 00100011 |
-----------------------
在发送方,您可以这样打包位:

int bitBuffer = 0;
int numberOfSavedBits = 0;

// bit must be 1 or 0
void sendBit(int bit) {
    bitBuffer |= (bit << numberOfSavedBits);
    numberOfSavedBits++;
    if (numberOfSavedBits == 8) {
        sendByte(bitBuffer);
        numberOfSavedBits = 0;
        bitBuffer = 0;
    }
}
int encodedValues[1024];
...
// set encodedValues
...
char packedValues[128] = {0};
int i;
for (i=0; i<1024; i++) {
    if (encodedValues[i]) {
        packedValues[i/8] |= (1 << (i % 8));
    }
}
int-encodedValues[1024];
...
//设置编码值
...
char packedValue[128]={0};
int i;

对于(i=0;它实际上与哈夫曼编码无关,但本质上是询问如何通过套接字发送二进制数据。因此,它是的副本。关于如何将位打包到字节。您可以先将数据写入文件,然后再将其读回。一旦可以这样做,然后开始考虑如何使用套接字而不是文件。This实际上与哈夫曼编码无关,但本质上是询问如何通过套接字发送二进制数据。因此,它是的副本。关于如何将位打包成字节。您可以先将数据写入文件,然后再将其读回。一旦可以这样做,然后开始考虑如何使用套接字而不是文件。