首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从二进制到字符的c转换

从二进制到字符的c转换
EN

Stack Overflow用户
提问于 2016-04-04 10:31:35
回答 1查看 1.9K关注 0票数 0

我一直试图将二进制数字转换为字符,我使用以下代码将字符转换为二进制数:

代码语言:javascript
复制
void bin(char x){
    int y;
    for(y = 0; y < sizeof(char) * 8; y++){
    fprintf(f2,"%c", ( x & (1 << y) ) ? '1' : '0' );
}}

而且效果很好。

问题是,我不知道如何撤消它,我想得到这个二进制数字,并将它转换为初始字符。我正在使用折叠代码,但它会产生一个核心问题。

代码语言:javascript
复制
char subbuff[9];
memcpy( subbuff, &fichero[0], 8 );
subbuff[8] = '\0';


for(int k=8;k<fichero_len;k+=8){        

    char c = strtol(subbuff, 0, 2);
    printf("%s = %c = %d = 0x%.2X\n", subbuff, c, c, c);
    memcpy( subbuff, &fichero[k], k+8 );
    subbuff[8] = '\0';  

}

对于示例,如果我转换字符串"hola“,第一个代码显示”000101101111011000110110000110“。

但是如果我把它放到第二个代码中:

代码语言:javascript
复制
const char *hola="00010110111101100011011010000110";
char subbuff[16];
memcpy( subbuff, hola[0], 8 );
subbuff[8] = '\0';


for(int k=8;k<strlen(hola);k+=8){   
    char c = strtol(subbuff, 0, 2);
    printf("%s = %c = %d = 0x%.2X\n", subbuff, c, c, c);
    memcpy( subbuff, &hola[k], k+8 );
    subbuff[8] = '\0';  

}

它会产生一个核心问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-04 10:57:07

编辑1:

一个问题是,您将过多的字节复制到subbuff中。

代码语言:javascript
复制
memcpy( subbuff, &fichero[k], k+8 );

另一种情况是,您将一个错误的指针传递到memcpy

代码语言:javascript
复制
memcpy( subbuff, hola[0], 8 );

这会导致分段故障。请启用编译器警告.

在循环之外,甚至没有必要先这样做。也可以像这样做

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    const char *hola = "01101000011011110110110001100001";
    char subbuff[9];
    char result [256] = "";
    unsigned char c;
    int k;
    int index = 0;
    int fichero_len = (int)strlen(hola);

    for(k = 0; k < fichero_len; k += 8) {    
        memcpy(subbuff, &hola[k], 8);                   // <--- copy 8 butes only
        subbuff[8] = '\0';  
        c = (unsigned char)strtol(subbuff, 0, 2);
        printf("%s = %c = %d = 0x%.2X\n", subbuff, c, c, c);
        result[index++] = c;
        result[index] = '\0';
    }
    printf("Result = %s\n", result);
    return 0;
}

最后,您的位序列是反向的,所以您将不会得到您开始使用的char

编辑2:在向上面的代码中添加几行代码并反转hola定义中的位之后,我得到了这个输出。显然,您必须确保result[]足够长。

程序输出:

代码语言:javascript
复制
01101000 = h = 104 = 0x68
01101111 = o = 111 = 0x6F
01101100 = l = 108 = 0x6C
01100001 = a = 97 = 0x61
Result = hola
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36400221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档