Java与Delphi Base64编码

Java与Delphi Base64编码,java,delphi,encoding,base64,Java,Delphi,Encoding,Base64,Delphi和Java生成完全不同的值 我有MD5列表,我需要用Base64编码,然后用URLEncode编码 下面是相同哈希值的delphi和java输出 如何使用Delphi获得与Java相同的输出 MD5输入值: BB8C890E3E6372F2720709262BD42BF4 Java Base64编码输出值: vIRYPbGf3toJDQehgv3SOamnTNk= Delphi Base64编码输出值: QkI4Qzg5MEUzRTYzNzJGMjcyMDcwOTI2MkJEND

Delphi和Java生成完全不同的值

我有MD5列表,我需要用Base64编码,然后用URLEncode编码

下面是相同哈希值的delphi和java输出

如何使用Delphi获得与Java相同的输出

MD5输入值

BB8C890E3E6372F2720709262BD42BF4
Java Base64编码输出值:

vIRYPbGf3toJDQehgv3SOamnTNk=
Delphi Base64编码输出值:

QkI4Qzg5MEUzRTYzNzJGMjcyMDcwOTI2MkJENDJCRjQ=
delphi代码行是:

IdEncoderMIME1.EncodeString('BB8C890E3E6372F2720709262BD42BF4');
Java源代码是:

String md5 = new String(Base64.encodeBase64(decodedHex));
完整的Java代码(我希望与Delphi具有相同的结果): 公共静态void main(字符串[]args)引发异常 { 如果(参数长度!=8) { 用法(); 返回; }

它接受文本输入,编码为ASCII,然后编码为base64

String md5 = new String(Base64.encodeBase64(decodedHex));
这将采用
decodedHex
中的二进制数据,并将其编码为base64

String md5 = new String(Base64.encodeBase64(decodedHex));
因此,您的两段代码正在做不同的事情。为了让您取得任何进展,您确实需要确定您想要做什么。在我看来,采用二进制哈希、编码为十六进制、编码为ASCII然后编码为base64是没有意义的

String md5 = new String(Base64.encodeBase64(decodedHex));
所以我想说Delphi代码是个问题。你从二进制散列开始,然后用base64编码。我不能给你这样做的代码,因为你没有给我们足够的代码。例如,我很确定你不会以字符串文字的形式开始使用
'BB8C890E3E6372F2F2720709262BD42BF4'

但实际上,您的主要任务不是编写代码,而是牢牢掌握应该执行的编码

FWIW,文本和二进制之间的混淆是Delphi标签中反复出现的一个重要主题。我想这一切都源于Delphi程序员习惯于使用
string
,就好像它是一个字节数组一样。文本和二进制之间的这种模糊区分导致了类似
tidecodermie.EncodeString这会鼓励您错误地认为base64编码是对文本输入进行操作的


根据您最近的编辑,您希望将十六进制字符串解码为二进制,并对其进行base64编码。在Delphi中这样做:

uses
  System.Classes,
  System.NetEncoding;

function HexStringToBase64(const HexStr: string): string;
var
  md5bytes: TBytes;
begin
  SetLength(md5Bytes, Length(HexStr) div 2);
  HexToBin(PChar(HexStr), Pointer(md5Bytes), Length(md5Bytes));
  Result := TNetEncoding.Base64.EncodeBytesToString(md5Bytes);
end;
现在,除非您使用的是XE7或更高版本,否则您将不会有
t编码
。如果是这样,请选择另一个base64库。如果您更喜欢使用Indy编码器,那么您可以这样编写:

function HexStringToBase64(const HexStr: string): string;
var
  md5bytes: TIdBytes;
begin
  SetLength(md5Bytes, Length(HexStr) div 2);
  HexToBin(PChar(HexStr), Pointer(md5Bytes), Length(md5Bytes));
  Result := TIdEncoderMIME.EncodeBytes(md5Bytes);
end;
和FWIW,您的Java代码不会产生您声称的输出

它接受文本输入,编码为ASCII,然后编码为base64

String md5 = new String(Base64.encodeBase64(decodedHex));
这将采用
decodedHex
中的二进制数据,并将其编码为base64

String md5 = new String(Base64.encodeBase64(decodedHex));
因此,您的两段代码正在做不同的事情。为了让您取得任何进展,您确实需要确定您想要做什么。在我看来,采用二进制哈希、编码为十六进制、编码为ASCII然后编码为base64是没有意义的

String md5 = new String(Base64.encodeBase64(decodedHex));
所以我想说Delphi代码是个问题。你从二进制散列开始,然后用base64编码。我不能给你这样做的代码,因为你没有给我们足够的代码。例如,我很确定你不会以字符串文字的形式开始使用
'BB8C890E3E6372F2F2720709262BD42BF4'

但实际上,您的主要任务不是编写代码,而是牢牢掌握应该执行的编码

FWIW,文本和二进制之间的混淆是Delphi标签中反复出现的一个重要主题。我想这一切都源于Delphi程序员习惯于使用
string
,就好像它是一个字节数组一样。文本和二进制之间的这种模糊区分导致了类似
tidecodermie.EncodeString这会鼓励您错误地认为base64编码是对文本输入进行操作的


根据您最近的编辑,您希望将十六进制字符串解码为二进制,并对其进行base64编码。在Delphi中这样做:

uses
  System.Classes,
  System.NetEncoding;

function HexStringToBase64(const HexStr: string): string;
var
  md5bytes: TBytes;
begin
  SetLength(md5Bytes, Length(HexStr) div 2);
  HexToBin(PChar(HexStr), Pointer(md5Bytes), Length(md5Bytes));
  Result := TNetEncoding.Base64.EncodeBytesToString(md5Bytes);
end;
现在,除非您使用的是XE7或更高版本,否则您将不会有
t编码
。如果是这样,请选择另一个base64库。如果您更喜欢使用Indy编码器,那么您可以这样编写:

function HexStringToBase64(const HexStr: string): string;
var
  md5bytes: TIdBytes;
begin
  SetLength(md5Bytes, Length(HexStr) div 2);
  HexToBin(PChar(HexStr), Pointer(md5Bytes), Length(md5Bytes));
  Result := TIdEncoderMIME.EncodeBytes(md5Bytes);
end;

而且FWIW,您的Java代码不会产生您声称的输出。

您使用什么代码来转换它?问题可以在您的代码中找到,只有您可以看到。我们可能猜测您正在混淆二进制哈希5的编码和十六进制表示。当然,只有您可能知道如何编码那么,你想做什么呢?我使用这行代码:idencoderme1.EncodeString('bb8c890e3e6372f272070962bd42bf4');您使用什么代码来转换它?问题可以在您的代码中找到,只有您可以看到。我们可能会猜测您在编码二进制哈希5和它的十六进制表示之间感到困惑。当然,只有您可能知道如何编码。那么,您想做什么?我使用这一行:idencoderme1.EncodeString('BB8C890E3E6372F27209262BD42BF4')@DavidHeffernan现在你提到它了…XD我想我还不够清楚。我要把Delphi和Java代码加在一起。我想用Delphi得到相同的结果。我可以用Java生成输出的代码。@DavidHeffernan现在你提到它了…XD我想我还不够清楚。我要把Delphi和Java代码加在一起。我想有相同的结果ult与Delphi。我可以用java生成输出的代码。A完全同意你的看法。这个转换问题不是必需的,但我使用产品API来处理一些任务,API希望使用二进制编码的MD5哈希来完成这些任务。这个代码部分只是从文件生成MD5哈希并将它们存储到备忘录中。我需要传递se MD5哈希将WebAPI编程为二进制base64编码值。您需要继续努力理解我告诉您的内容。您似乎不理解文本和二进制之间的差异。我真的不明白。我需要将MD5哈希字符串值转换为二进制吗,以及如何转换?哟