gpt4 book ai didi

java - 如何使用十六进制值比较字符串对象和文字

转载 作者:行者123 更新时间:2023-11-30 02:02:04 25 4
gpt4 key购买 nike

下面显示的代码使用NTLM Windows身份验证方法从系统获取用户名,我需要比较用户名(current_user_eid)。

将 intern() 方法应用于预设值似乎适用于初始化值。

文字字符串和对象字符串之间的字符串比较给出的输出为 false,但在屏幕上它们给出了相同的输出。

<%@ page import="sun.misc.BASE64Encoder" %>
<%
String auth = request.getHeader("Authorization");
String current_user_eid= null;
if (auth == null) {
response.setStatus(response.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM");
return;
}
if (auth.startsWith("NTLM")) {
byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5));
int off = 0, length, offset;

if (msg[8] == 1) {
off = 18;
byte z = 0;
byte[] msg1 =
{(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S',
(byte)'S', (byte)'P', z,
(byte)2, z, z, z, z, z, z, z,
(byte)40, z, z, z, (byte)1, (byte)130, z, z,
z, (byte)2, (byte)2, (byte)2, z, z, z, z, //
z, z, z, z, z, z, z, z};

response.setStatus(response.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM " + new sun.misc.BASE64Encoder().encodeBuffer(msg1).trim());
return;
}
else if (msg[8] == 3) {
off = 30;
length = msg[off+17]*256 + msg[off+16];
offset = msg[off+19]*256 + msg[off+18];
current_user_eid = new String(msg, offset, length);
}
else
return;

length = msg[off+1]*256 + msg[off];
offset = msg[off+3]*256 + msg[off+2];
current_user_eid = new String(msg, offset, length);
length = msg[off+9]*256 + msg[off+8];
offset = msg[off+11]*256 + msg[off+10];
current_user_eid = new String(msg, offset, length); //current system user name "yaseer"

// String Comparison starts here....

String hard_str = new String("yaseer"); //
String hard_str_in=hard_str.intern();

String eid_str=new String(current_user_eid.toString()); //passing the fetched username which is yaseer
String eid_str_in = eid_str.intern(); // system username

String comp_str = "yaseer"; // String for comparison

System.out.println(hard_str_in == comp_str); // give true

System.out.println(eid_str_in == comp_str); // gives false


if(eid_str_in .equals(comp_str ))
{
System.out.println("true");
}
else
{
System.out.println("false");
}
}
%>

谁能帮我解决这个问题?

最佳答案

字符串的正确用法是:

Charset charset = StandardCharsets.ISO_8859_1;
...
current_user_eid = new String(msg, offset, length, charset);
}
else
return;

length = msg[off+1]*256 + msg[off];
offset = msg[off+3]*256 + msg[off+2];
current_user_eid = new String(msg, offset, length, charset);
length = msg[off+9]*256 + msg[off+8];
offset = msg[off+11]*256 + msg[off+10];
current_user_eid = new String(msg, offset, length, charset);
//current system user name "yaseer"

// String Comparison starts here....

String hard_str = "yaseer"; //

String eid_str = current_user_eid; //passing the fetched username which is yaseer
String eid_str_in = eid_str.intern(); // system username

String comp_str = "yaseer"; // String for comparison

System.out.println(hard_str_in == comp_str); // give true

System.out.println(eid_str_in == comp_str); // gives false
System.out.println(eid_str_in.equals(comp_str));
// gave true ("on screen"), expected to give false

如果我理解正确的话,最后两行会给出不同的结果。

对于纯 ASCII“yaseer”来说,情况并非如此(假设您没有在带有 EBCDIC 且 Java 源代码/Java 编译器编码错误的 AS/400 上工作)。

但是我看到 current_user_eid 被分配了两次,第一次分配了 6 个字节,这可能对应于 6 个字母的“yaseer”。

所以我假设第二个 current_user_eid 是一个混淆。

转储字符串以获得其值:

System.out.println(Arrays.toString(eid_str_in.toCharArray()));

对于其余部分:.intern() 不再可以使用 w.r.t。效率;因此也不是==。在早期版本中,驻留常量会进入有限大小的“永久内存生成”,如果驻留太多且太频繁,则有其缺点。

字节始终会转换为 Unicode Stringchar (UTF-16),可能使用平台默认字符集。因此,最好显式提供 Charset,甚至 Charset.defaultCharset(),因为它显式声明了平台依赖性。

关于java - 如何使用十六进制值比较字符串对象和文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52515720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com