位序转字符串的一种高效方法

本文介绍了一种使用位操作将二进制数据转换为字符串的方法。通过定义位映射表并利用 htonl 函数进行字节序转换,实现了从二进制位到 ASCII 字符串的有效转换。代码中详细展示了初始化位映射表的过程以及具体的转换函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <arpa/inet.h>

#define ROW_UNIT    512
#define UNIT_LENGTH 500
/* 其中ROW_UNIT为使用的位长度,是64的整数倍,但乘积大于UIIT_LENGTH
   UNIT_LENGTH为需要转换的位长度。
   UNIT_LENGTH为需要转换的位长度。也可以是64 64 等,
   ROW_UNIT 需要不小于 UNIT_LENGTH
  */
unsigned long long bits_str[256];
static inline int bits_to_str_init(void)
{
        int i, low, high;
        int bit_str[16] = {
                0x00000000, 0x00000001, 0x00000100, 0x00000101,
                0x00010000, 0x00010001, 0x00010100, 0x00010101,
                0x01000000, 0x01000001, 0x01000100, 0x01000101,
                0x01010000, 0x01010001, 0x01010100, 0x01010101,
        };

        memset(bits_str, '0', sizeof(bits_str));
        for(i=0; i<256; ++i) {
                low = i&0x0F;
                high = i&0xF0;
                high >>= 4;
                *(int *)&bits_str[i] += htonl(bit_str[high]);
                *((int *)&bits_str[i] + 1) += htonl(bit_str[low]);
        }
        return 0;
}

static inline int bitstostr(char *str, unsigned char *bits)
{
        int i;
        unsigned long long *pos = (unsigned long long *)str;
        int c = ROW_UNIT>>3;
        for(i=0; i<c; ++i) {
                *pos = bits_str[(int)(*bits)];
                ++pos;
                ++bits;
        }
        str[UNIT_LENGTH] = 0;
        return 0;
}

int main(int argc ,char *argv[])
{
	if(bits_to_str_init() < 0) return -1;
	unsigned char bits[64];
	int i;
	for(i=0; i<64; ++i) {
		bits[i] = i;
	}
	char str[512];
	bitstostr(str, bits);
	for(i=0; i<strlen(str); ++i) {
		printf("%c", str[i]);
		if(((i+1)&0x7) == 0) printf("\n");
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值