2015-05-21 15 views
1

在Delphi XE7,我们从字符串中使用将一些值字节,从字节字符串:如何unicode字符串转换为字节数组,反之亦然德尔福2007

MyBytes := TEncoding.Unicode.GetBytes(MyString); 

MyString := TEncoding.Unicode.GetString(MyBytes); 

我想写我自己的函数,在Delphi-2007上得到相同的值。我真的不熟悉有关字符编码,我想我应该在Delphi 2007使用WideString的类型(这是正确的?)

function StringToBytes(AValue : WideString) : TBytes; 
begin 
    Result := //... 
end; 

function BytesToString(AValue : TBytes) : WideString; 
begin 
    Result := //... 
end; 

有人能帮助我在写这两个函数?

+0

@DavidHeffernan:这有什么关系吗?让我更详细地解释这个问题。为了在数据库中保存一些加密的字符串,我们使用我们自己的加密/解密函数在TBytes上工作。由于这个事实,在加密解密之前,我们需要在T​​Bytes中转换字符串。问题来了。两个不同的应用程序应该读取这些字符串,并且应该能够对这些字符串进行加密和解密(App1已经在Delphi-2007中编译,app2已经在XE7中编译过)。 – ExDev

+0

哦,我的话,现在我明白了。这是微不足道的。等一下。 –

回答

3

由于WideString是UTF-16编码,并且您想要UTF-16编码的字节数组,因此不需要转换。你可以执行这样的直接内存拷贝:

function StringToBytes(const Value : WideString): TBytes; 
begin 
    SetLength(Result, Length(Value)*SizeOf(WideChar)); 
    if Length(Result) > 0 then 
    Move(Value[1], Result[0], Length(Result)); 
end;  

function BytesToString(const Value: TBytes): WideString; 
begin 
    SetLength(Result, Length(Value) div SizeOf(WideChar)); 
    if Length(Result) > 0 then 
    Move(Value[0], Result[1], Length(Value)); 
end; 
+0

它不适用于Delphi-2007。作为一个例子,行“ShowMessage(BytesToString(StringToBytes('aaa')));”显示一个显示'a'的对话框。我认为这是因为在delphi-2007中SizeOf(Char)是1。它似乎通过用WideChar替换Char来工作 – ExDev

+0

对不起。我误解了这个评论。这是我需要更多的照顾。现在的答案是正确的。我忘记了Char是编译器中的AnsiChar。 –

相关问题