import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/*
* String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
* byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组
*
* 编码:把看得懂的变成看不懂的
* String -- byte[]
*
* 解码:把看不懂的变成看得懂的
* byte[] -- String
*
* 举例:谍战片(发电报,接电报)
*
* 码表:小本子
* 字符 数值
*
* 要发送一段文字:
* 今天晚上在老地方见
*
* 发送端:今 -- 数值 -- 二进制 -- 发出去
* 接收端:接收 -- 二进制 -- 十进制 -- 数值 -- 字符 -- 今
*
* 今天晚上在老地方见
*
* 编码问题简单,只要编码解码的格式是一致的。
*/
public class StringDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "你好";
// String -- byte[]
byte[] bys = s.getBytes(); // [-60, -29, -70, -61]
// byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61]
// byte[] bys = s.getBytes("UTF-8");// [-28, -67, -96, -27, -91, -67]
System.out.println(Arrays.toString(bys));
// byte[] -- String
String ss = new String(bys); // 你好
// String ss = new String(bys, "GBK"); // 你好
// String ss = new String(bys, "UTF-8"); // ???
System.out.println(ss);
}
}
1. 汉字信息交换码(国标码)
《信息交换用汉字 编码字符集·基本集》是我国于1980年制定的国家标准 GB2312-80,代号为国标码,是国家规定的用于汉字信息处理使用的代码依据。
GB2312-80中规定了信息交换用的6763个汉字和682个非汉字图形符号(包括几种外文字母、数字和符号)的代码。
6763个汉字又按其 使用频度、组词能力以及用途大小分成一级常用汉字3755个和二级常用汉字3008个。
一级汉字按拼音字母顺序排列;若遇同音字,则 按起笔的笔形顺序排列;若起笔相同,则按第二笔的笔形顺序排列,依次类推。所谓笔形顺序,就是横、竖、撇、点和折的顺序。二级汉字按 部首顺序排列。
在此标准中,每个汉字(图形符号)采用双字节表示。每个字节只用低7位,最高位恒为1。由于低7位中有34种状态是用 于控制字符,因此,只有94(128-34=94)种状态可用于汉字编码。这样,双字节的低7位只能表示94×94=8836种状态。
编码范围
二进制数码
十进制数码
基本 ASCII 码
00000000~01111111
0~127
控制字符
00000000~00100000、01111111
0~32、127
可用汉字段
00100001~01111110
33~126 (1~94)
扩充 ASCII 码
10000000~11111111
128~255
控制字符
10000000~10100000、11111111
128~160、255
GB2312-80
10100001~11111110
161~254 (1~94)
此标准的汉字编码表有94行、94列,其行号称为区号,列号称为位号。双字节中,用 高字节表示区号,低字节表示位号。非汉字图形符号置于第1~11区,一级汉字3755个且于第16~55区,二级汉字3008个置于第56~87区。
每个图形字符的汉字交换码,均用两个字节的低7位二进制码表示。汉字国标码通常用十六进制数表示。
例如:“中”字的区号为 54,位号为48,计算它的二进制数和十六进制数国标码。
解:先将区、位号分别加上 32 :
54+32=86
48+32=80
分别转换为二进制数:
(86)10=01010110
(80)10=0 1010000
得到二进制数国标码为:
01010110 01010000。
最后通过 8 4 2 1 ── 二进制取位法转换成十六 进制汉字国标码为:5650。
又如“国”字的区号为25,位号为90,用以上相同的方法得到它的国标码为:
二进制:00111001 01111010
十六进制:397A
----------------------------------------------------------------
基于以上原则,则
11000100,11100011,10111010,11000011
(1100 0100 1110 0011)2,(1011 1010 1100 0011)2
(C4E3)16,(BAC3)16
查表可知:C4E3‘你’,BAC3‘好’
百度搜索 汉字内码 有详细的解释。
这个无须转换,只要选择正确的存储方式即可。void * 就是二进制,强制为tchar就是汉字了,或者你可以在void * 和tchar直接做内存拷贝memmove也可以
首先要清楚文件里, 储存的数据的类型,是int,long,long long 还是 float,double
其次文件有无字节序(大小端)问题
这两个问题解决了
直接按照数据类型定义一个定长数据,或者数组一次性读入,或者分批读入全部文件。
需要的话,读取以后,先转换一下字节顺序
fopen,二进制读方式,打开文件,fread 读取文件,fclose 关闭文件
然后 转换成十进制 ACII格式的数据,输出到文本文件中去。
fopen,文本写方式,打开文件,fprintf 写入文件,fclose 关闭文件。
基本上就可以了
具体可以了解一下 fopen,fread,fwrie,fclose , fprintf ,fscanf
这些C流式文件读写,打开,关闭函数
faint,岂有此理...
可以用十六进制显示并存入txt文件,如下面的方法
但这绝对是一个愚蠢的主意。
-------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const BUF_SIZE=1024;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
f:file of byte;
implementation
{$R *.DFM}
function Str2Hex(const data: array of byte; len: integer): string;
const
Hex:array[0..15] of char='0123456789ABCDEF';
var
i: Integer;
begin
setlength(result,length(data)*2);
for i := 0 to Len-1 do
begin
result[i*2+1]:=Hex[data[i] shr 4];
result[i*2+2]:=Hex[data[i] and $F];
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
NumRead:integer;
b:array[1..BUF_SIZE] of byte;
s: string;
begin
assignfile(f,'T0105.101');
Reset(f);
repeat
BlockRead(f,b,BUF_SIZE,NumRead);
if NumRead=0 then break;
s:=Str2Hex(b,NumRead); //将每个字节以16进制表示
Memo1.Lines.Add(s);
until (NumRead = 0);
closefile(f);
Memo1.Lines.SaveToFile('binfile.txt');
end;
end.
就是把图片编为十六进制,然后再用解码程序解成 2进制,把图象再显示出来。
只是这个解码的程序没搞定,
编码的程序如上。
没分了,有了再给。
1、原理
二进制转化为汉字,可以先将二进制转化为16进制,然后再利用16进制和汉字之前的对应关系进行转化。
2、C#版的代码如下
private string BinaryToChinese(string input)
{
StringBuilder sb=new StringBuilder();//建立string
int numOfBytes = input.Length / 8;//计算尾数
byte[] bytes = new byte[numOfBytes];//二进制
for (int i = 0; inumOfBytes; ++i)
{
bytes[i] = Convert.ToByte(input.Substring(8 * i, 8), 2);//对字符串转成对应二进制
}
return System.Text.Encoding.Unicode.GetString(bytes);//解码得到汉字
}