char数组如何转换为string型?(25分)

  • 主题发起人 主题发起人 units
  • 开始时间 开始时间
U

units

Unregistered / Unconfirmed
GUEST, unregistred user!
array of char
如何转换为string型呢?请教
请教诸位
 
其实我是想知道如何string和十六进制数字如何互相转换
 
to benhacker,用这个方法会出错,比如下面的代码,当输入为一个八个空格的字符串的时候就会出错:
function StrToHex(src: string): string;
var
i: integer;
HexArray: array of char;
srcArray: array of char;
stmp: string;
begin
SetLength(srcArray,8);
SetLength(HexArray,16);
for i:=0 to 7 do
begin
srcArray := src[i+1];
end;
BinToHex(@srcArray,@HexArray,16);
Result := pchar(HexArray);
end;
 
function IntToHex(Value: Integer
Digits: Integer): string
overload;
function IntToHex(Value: Int64
Digits: Integer): string
overload;
先把string转换为整数,然后再转换为十六进制嘛
 
请教royal1442如何将string转为整数呢?
 
IntToStr
(抱歉我去吐一下,先!)
 
IntToStr是把整型转换为字符串的啊
这个str可能包括中文
 
中文也能转换为整数?你高人!
 
所以请教你,如何将一个字符串转为十六进制的字符,这个字符串可能包含中文
 
说说你最终的目的吧
 
有个现成的函数 能转换过去 和转换回来的 等我找找
 
没找到 笨蛋方法
Str:='没找到 笨蛋方法';
for i:=1 to length(str) do
begin
Result:=Result + inttohex(ord(str),2);
end;
 
我现在是做一个读写IC卡的操作,有一个DLL函数接口,它的接口函数一次读取IC卡内的十六个字节组成32个字节的十六进制。其中后八个字节(后16个字节的十六进制)在IC卡内是用c语言的unsigned char类型存储的。
因为DLL函数的结构的输入输出都是十六进制数,所以我如果想在IC卡内的后八个字节存储“清华同方”这个字符串,我必须把它转为16个字节的十六进制,然后调用DLL函数保存。
如果想读取“清华同方”这串字符,也必须调用DLL函数得到十六进制的读取结果,然后将这个十六进制的结果还原成“清华同方”这个字符串。

所以我的问题就是如何在这之间互相转换
 
to 睢志强,那么十六进制转回字符串应该怎么做呢?这个字符串可能包括中文,请教,分数不够我等会再加50分。
 
感谢睢志强大侠,用你的方法问题解决了
 
虽然楼主的表述方式多少有些问题,但我根据自己的理解加猜测,得出了楼主的大概意思,大家看看对不对?呵呵,如果错了,请扔些鸡蛋番茄就好了:
1. 既然DLL“接口函数一次读取IC卡内的十六个字节组成32个字节的十六进制”,因此可以得出这么个结论:一组16个字节的数据经过某种转换规则以后需要用32个字节的数据来表示。那么,抛开楼主的应用里面存在一些特殊的、不为别人所知的转换规则这种可能性不谈,在现实世界里还有什么类似又众所周知的转换规则呢?--如果大家理解了我的意思,那不知道有没有人很凑巧也跟我一样想到了一个绝大多数程序员都应该知道的规则:一个8位的字节数据需要用两位16进制数表示,那么如果为了以字符的形式存储这两位16进制数,就需要两个字符也就是两个字节(因为一个ASCII字符需要一个字节的存储空间,别告诉我你不知道这一点,呵呵[8D])。OK,可能你会觉得我这一大段话太罗嗦了,根本不知道我在讲什么,那么我举个再简单不过的例子来试图说明这个“十六个字节组成32个字节的十六进制”的规则是如何运作的--

假设有一个字节的数据--嗯哼,别管它表示什么东西,你只要注意它具体的二进制数据值--啊哈,我假设它是$D8吧(注意,我用的是Delphi的十六进制数表示法)。正如大家看到的,为了表示(这个表示不是指向计算机表示,而是向用户即人表示)这个8位的字节数据,需要用到两位的16进制数,如果要在计算机里面存储这种表示方法而不是字节数据本身的话,那么我们要存储的就是那两个16进制数而不是那个字节--因此我们需要用“两个字节来存储对于一个字节数据值的十六进制表示方式”--而这,就应该是楼主“口函数一次读取IC卡内的十六个字节组成32个字节的十六进制”这句话所真正要表达的意思吧!

2. 如果我的猜测是对的,那么按照这种转换规则,以上面我举的那个$8D字节数据值为例,为了存储它的字符串形式的16进制数表示法,就转换称为了$8 $D 这两个字节数据。

3. 刚才我举了个可以表示任意类型的字节数据作为转换依据,但实际上不管这个字节在程序里面到底具体表示什么类型的数据,其实转换方法跟结果都是一样的。比如说字符串数据,就拿楼主提到的“清华同方”来演示一下吧(注意,这里演示的虽然是string类型的字符串,但对于WideString来说同样是适用的。唯一的区别就是WideString里面所有的字符都是两个字节的,但string里面既有双字节的字符,也有单字节的字符而已。但本质生都是其编码的字节数据值)--
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

ca:array [1..16] of char;

implementation

{$R *.dfm}

// 下面这个过程演示了如何将字符串转换为16进制数表示形式的字符数组
procedure TForm1.Button1Click(Sender: TObject)

var
s,tmps:string;
i:integer;
ChrCode,HiBit,LoBit:Byte;
begin
s:='清华同方';
Edit1.Text:=s;
for i:=1 to Length(s) do
begin
ChrCode:=Ord(s);
HiBit:=ChrCode shr 4;
LoBit:=ChrCode and $0F;
if HiBit<$A then
ca[i*2-1]:=Chr(HiBit+$30)
else
ca[i*2-1]:=Chr(HiBit+$37);
if LoBit<$A then
ca[i*2]:=Chr(LoBit+$30)
else
ca[i*2]:=Chr(LoBit+$37);
tmps:=tmps+'$'+ca[i*2-1]+' $'+ca[i*2]+' '
end;
Edit2.Text:=tmps
end;

// 下面这个过程演示了如何将16进制数表示形式的字符数组转换为字符串
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
s:string;
ChrCode,HiBit,LoBit:Byte;
begin
for i:=1 to 8 do
begin
HiBit:=Ord(ca[i*2-1]);
if HiBit in [$30..$39] then
HiBit:=HiBit-$30
else
HiBit:=HiBit-$37;
LoBit:=Ord(ca[i*2]);
if LoBit in [$30..$39] then
LoBit:=LoBit-$30
else
LoBit:=LoBit-$37;
ChrCode:=HiBit shl 4 + LoBit;
s:=s+Chr(ChrCode)
end;
Edit3.Text:=s
end;

end.
 
后退
顶部