我一直在尝试将二进制数转换为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';
}
它产生一个核心问题
编辑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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句