【问题标题】:Binary to char converting in c在c中将二进制转换为char
【发布时间】:2016-04-04 10:31:35
【问题描述】:

我一直在尝试将二进制数转换为char,我使用以下代码将char转换为二进制:

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

而且效果很好。

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

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”,第一个代码显示“00010110111101100011011010000110”

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

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';  

}

它会产生一个核心问题

【问题讨论】:

  • 请出示MCVE
  • 您正在将至少 16 个字节复制到 char subbuff[9]

标签: c binary char


【解决方案1】:

编辑 1:

一个问题是您将太多字节复制到subbuff

memcpy( subbuff, &fichero[k], k+8 );

另一个是你将错误的指针传递给memcpy

memcpy( subbuff, hola[0], 8 );

这将导致段错误。 请启用编译器警告。

甚至没有必要在循环之外首先这样做。它可以像这样完成

#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[] 足够长。

程序输出:

01101000 = h = 104 = 0x68
01101111 = o = 111 = 0x6F
01101100 = l = 108 = 0x6C
01100001 = a = 97 = 0x61
Result = hola

【讨论】:

  • 好的,现在它可以正常工作,但正如你所说,它似乎不是原始文本
  • 那是因为你发送位 0 到 7 到输出,你必须发送位 7 到 0。
  • for(y = CHAR_BIT-1; y &gt;= 0; y--)
  • 对不起,我不明白
  • 就像你在左边写一个最高有效位的十进制数一样,你在左边写一个最高sig位的二进制数。您首先将位 0 ​​发送到输出。所以你的位模式是相反的。我刚刚评论的y 循环以正确的顺序发送位:MS。先点。 CHAR_BIT 是一个字节中的位数,可以在 limits.h 中找到。 OTOH 我的循环不使用sizeof(char),因为根据定义它总是 1。
猜你喜欢
  • 2012-06-05
  • 2012-02-24
  • 2021-11-14
  • 2011-06-21
  • 2022-11-07
  • 2013-05-07
  • 1970-01-01
  • 2019-03-18
  • 2012-12-26
相关资源
最近更新 更多