socket编程中的Huffman编码
我想在用C编写的客户机-服务器套接字程序中使用哈夫曼代码socket编程中的Huffman编码,c,sockets,huffman-code,bit-fields,C,Sockets,Huffman Code,Bit Fields,我想在用C编写的客户机-服务器套接字程序中使用哈夫曼代码 因此,我编写了一段代码,用于从文本文件中生成哈夫曼树作为输入。但是,我不知道如何在客户机-服务器套接字程序中使用它。 到目前为止,我已经考虑了以下方法-- 1) 通过套接字连接以位的形式发送编码文件。不能这样做,因为我使用的是C语言,并且没有位数据类型(我怀疑在任何语言中都没有位数据类型)。 2) 以整数0s和1s的形式发送数据。这将完全违背目的。字符(1字节)Int(至少4字节)您必须自己将位打包成字节。这不是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实际上与哈夫曼编码无关,但本质上是询问如何通过套接字发送二进制数据。因此,它是的副本。关于如何将位打包成字节。您可以先将数据写入文件,然后再将其读回。一旦可以这样做,然后开始考虑如何使用套接字而不是文件。