如何从内存获取机器码呢?

时间:2020-12-24 17:09:03
从unicode文本中获取一个汉字后,计算机首先得将其转换成二进制机器码来存贮在内存中,怎么从内存中获取这个字的二进制码呢?
#include <stdio.h>
void main(void)
{
FILE *fp;
fp=fopen("E:\\c\\大明.txt","r");
char cl;
do
{
cl = fgetc(fp);
//如何从内存获得文字的二进制码

}
while (cl != EOF);
fclose(fp);

}

17 个解决方案

#1


如果是utf16编码的话顶一个short数组

#2


c1变量不就是内存吗?
不明白楼主意思

#3


	unsigned char a[3]="我";
printf("%2X%2X",a[0],a[1]);

#4


	unsigned char a[3]="我";
printf("%c%c",a[0],a[1]);

#5


引用 2 楼 xky96 的回复:
c1变量不就是内存吗?
不明白楼主意思

就是想获得cl的二进制码,
将文本读入cl之后,怎么样读出来才是二进制码呢?

#6


它已经是二进制了

#7


.强制类型转换。
wchar_t x='身';
long temp=0L;
temp=(long)x;

wprintf(L"%x\n\n",x);
printf("%ld",temp);
分别输出 身 字的十六进制和十进制码。

#8


写入什么就读出什么,差别只在于表现的形式,底层都是二进制

#9


引用 6 楼 ForestDB 的回复:
它已经是二进制了

补充说明一下吧,
得到文字的二进制码后,
如果首位是0,那么就将这个字存入文档0,
如果首位是1,那么就将这个字存入文档1,
类似于英文处理中,将不同首字母的单词,存入不同的文件中

#10


引用 8 楼 AnYidan 的回复:
写入什么就读出什么,差别只在于表现的形式,底层都是二进制

就是想知道底层的代码是什么,然后根据不同的底层代码,将字符分类存储在不同的文件中,
就像字典中,根据首字母来建立索引一样,方便快速的找到某个字在哪一个文件之中

#11


引用 7 楼 l0ve_m00n 的回复:
.强制类型转换。
wchar_t x='身';
long temp=0L;
temp=(long)x;

wprintf(L"%x\n\n",x);
printf("%ld",temp);
分别输出 身 字的十六进制和十进制码。

十六进制和十进制,这里不需要,只想知道二进制码就够了。
目的是根据二进制码来对文字进行分类存储

#12


举例:
char c1 = '0xA6';
c1是不是二进制?

#13


引用 12 楼 ForestDB 的回复:
举例:
char c1 = '0xA6';
c1是不是二进制?

还真不知道,刚刚学习编程的菜鸟一个,
如何将cl以二进制码显示在屏幕上呢?
类型转换?

#14


1)C的方式
char c1 = '0xA6'
char s[65];//long long 64Bits,65个字符几乎可以表示任何整型数据的二进制了;
//char 是C中最短的整型数据了; 
//VC6 以上:
  printf("%s",itoa(c,s,2));//输出整型的二进制,8~32Bits都可以这样用。
2)C++:
char c1 = '0xA6'
bitset<8> b(c1);//c1最多8Bits
cout<<b.tostring()<<endl;//输出字符串形式。

PS:
二进制形式数据太长,通常会把二进制数,用16进制表示;
1个16进制数字,用一个字符,代表4Bits数据。

很方便的,早期有用8进制表示的;现在一般都是16进制。

一个char类型数据: 
用16进制表示,只需要2个字符。
10进制要3个字符;
2进制8个字符;
字符本身是计算机内部编码的二进制数据;
内部二进制数据1个字符;
占用一个字节,一共8个Bits。

所以计算机可表示的数据,内部都是二进制编码的;
所以不管哪一种进制表示,在计算机中都是二进制的;
只是这种二进制人是很难识别的;
于是就有各种进制的字符串表示;这是人可以直接识别的数据。

数据输出也是要转换成,各种进制的字符串表示来输出。
于是我们就看到了数据的16进制形式。这是人和计算机都很容易识别的形式。
于是我们就看到了数据的10进制形式。这是人最容易识别的形式。
于是我们就看到了数据的8进制形式。早期的一种数据表示方法。

于是我们就看到了数据的2进制形式。这是计算机内部表示的显化,人可以识别的二进制格式。
这种情况不是类型转换,而是数据的表示方法的转换,数据格式的转换。

类型转换是把一种格式的数据,看做另一种格式的数据使用。
(type)这是C的类型转换,例如 
char c='0';
int t =(int)c;
C++有四个类型转换运算符
static_cast<type>()    //静态类型转换,内部类型直接转换。 
double y=10; int n=  static_cast<int>(y);
const_cast<type>()     //常量属性转换,去掉指针的 const 或者volatile属性
dynamic_cast<type>()   //向下类型转换,父类转子类指针。
reinterpret_cast<type>()//任意类型指针的转换,不包括const_cast 可以转换的内容,这是一种不可移植的转换。

类型转换不是一种格式转换,只是一种类型替换;

整型,浮点型转字符串,是一种数据格式的转换。

这不是同一种转换。







#15


#include <stdio.h>
#include <stdlib.h>
void main() {
    FILE *fp;
    int cl;
    char bs[33];
    char b[33];

    fp=fopen("E:\\c\\大明.txt","rb");
    if (fp) {
        while (1) {
            cl = fgetc(fp);
            if (EOF==cl) break;
            _itoa(cl,b,2);
            sprintf(bs,"%032s",b);
            printf("%s ",bs+24);
        }
        fclose(fp);
    } else {
        printf("Can not open file E:\\c\\大明.txt\n");
    }
}

#16


电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

#17


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

#1


如果是utf16编码的话顶一个short数组

#2


c1变量不就是内存吗?
不明白楼主意思

#3


	unsigned char a[3]="我";
printf("%2X%2X",a[0],a[1]);

#4


	unsigned char a[3]="我";
printf("%c%c",a[0],a[1]);

#5


引用 2 楼 xky96 的回复:
c1变量不就是内存吗?
不明白楼主意思

就是想获得cl的二进制码,
将文本读入cl之后,怎么样读出来才是二进制码呢?

#6


它已经是二进制了

#7


.强制类型转换。
wchar_t x='身';
long temp=0L;
temp=(long)x;

wprintf(L"%x\n\n",x);
printf("%ld",temp);
分别输出 身 字的十六进制和十进制码。

#8


写入什么就读出什么,差别只在于表现的形式,底层都是二进制

#9


引用 6 楼 ForestDB 的回复:
它已经是二进制了

补充说明一下吧,
得到文字的二进制码后,
如果首位是0,那么就将这个字存入文档0,
如果首位是1,那么就将这个字存入文档1,
类似于英文处理中,将不同首字母的单词,存入不同的文件中

#10


引用 8 楼 AnYidan 的回复:
写入什么就读出什么,差别只在于表现的形式,底层都是二进制

就是想知道底层的代码是什么,然后根据不同的底层代码,将字符分类存储在不同的文件中,
就像字典中,根据首字母来建立索引一样,方便快速的找到某个字在哪一个文件之中

#11


引用 7 楼 l0ve_m00n 的回复:
.强制类型转换。
wchar_t x='身';
long temp=0L;
temp=(long)x;

wprintf(L"%x\n\n",x);
printf("%ld",temp);
分别输出 身 字的十六进制和十进制码。

十六进制和十进制,这里不需要,只想知道二进制码就够了。
目的是根据二进制码来对文字进行分类存储

#12


举例:
char c1 = '0xA6';
c1是不是二进制?

#13


引用 12 楼 ForestDB 的回复:
举例:
char c1 = '0xA6';
c1是不是二进制?

还真不知道,刚刚学习编程的菜鸟一个,
如何将cl以二进制码显示在屏幕上呢?
类型转换?

#14


1)C的方式
char c1 = '0xA6'
char s[65];//long long 64Bits,65个字符几乎可以表示任何整型数据的二进制了;
//char 是C中最短的整型数据了; 
//VC6 以上:
  printf("%s",itoa(c,s,2));//输出整型的二进制,8~32Bits都可以这样用。
2)C++:
char c1 = '0xA6'
bitset<8> b(c1);//c1最多8Bits
cout<<b.tostring()<<endl;//输出字符串形式。

PS:
二进制形式数据太长,通常会把二进制数,用16进制表示;
1个16进制数字,用一个字符,代表4Bits数据。

很方便的,早期有用8进制表示的;现在一般都是16进制。

一个char类型数据: 
用16进制表示,只需要2个字符。
10进制要3个字符;
2进制8个字符;
字符本身是计算机内部编码的二进制数据;
内部二进制数据1个字符;
占用一个字节,一共8个Bits。

所以计算机可表示的数据,内部都是二进制编码的;
所以不管哪一种进制表示,在计算机中都是二进制的;
只是这种二进制人是很难识别的;
于是就有各种进制的字符串表示;这是人可以直接识别的数据。

数据输出也是要转换成,各种进制的字符串表示来输出。
于是我们就看到了数据的16进制形式。这是人和计算机都很容易识别的形式。
于是我们就看到了数据的10进制形式。这是人最容易识别的形式。
于是我们就看到了数据的8进制形式。早期的一种数据表示方法。

于是我们就看到了数据的2进制形式。这是计算机内部表示的显化,人可以识别的二进制格式。
这种情况不是类型转换,而是数据的表示方法的转换,数据格式的转换。

类型转换是把一种格式的数据,看做另一种格式的数据使用。
(type)这是C的类型转换,例如 
char c='0';
int t =(int)c;
C++有四个类型转换运算符
static_cast<type>()    //静态类型转换,内部类型直接转换。 
double y=10; int n=  static_cast<int>(y);
const_cast<type>()     //常量属性转换,去掉指针的 const 或者volatile属性
dynamic_cast<type>()   //向下类型转换,父类转子类指针。
reinterpret_cast<type>()//任意类型指针的转换,不包括const_cast 可以转换的内容,这是一种不可移植的转换。

类型转换不是一种格式转换,只是一种类型替换;

整型,浮点型转字符串,是一种数据格式的转换。

这不是同一种转换。







#15


#include <stdio.h>
#include <stdlib.h>
void main() {
    FILE *fp;
    int cl;
    char bs[33];
    char b[33];

    fp=fopen("E:\\c\\大明.txt","rb");
    if (fp) {
        while (1) {
            cl = fgetc(fp);
            if (EOF==cl) break;
            _itoa(cl,b,2);
            sprintf(bs,"%032s",b);
            printf("%s ",bs+24);
        }
        fclose(fp);
    } else {
        printf("Can not open file E:\\c\\大明.txt\n");
    }
}

#16


电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

#17


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。