我使用手机并每天处理MEID号码。因此,我没有在线搜索MEID(长度为14的十六进制数)到伪ESN(长度为8的十六进制数)计算器,我想我可以创建自己的程序。从MEID获得pESN的方法在理论上相当简单。例如,给定MEID 0xA0000000002329,为了生成pESN,需要将SHA-1应用于MEID。 A0000000002329上的SHA-1给出了e3be267a2cd5c861f3c7ea4224df829a3551f1ab。取这个结果的最后6个十六进制数,并将其追加到0x80 - 结果是0x8051F1AB。
现在这是我到目前为止的代码:
public void sha1() throws NoSuchAlgorithmException {
String hexMEID = "A0000000002329";
MessageDigest mDigest = MessageDigest.getInstance("SHA1");
byte[] result = mDigest.digest(hexMEID.getBytes());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.length; i++) {
sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
System.out.println(sb.toString());
}
问题是使用这种方法,A0000000002329上的SHA-1给出了a89b611b421f57705bd013297ce3fc835f706ab0而不是e3be267a2cd5c861f3c7ea4224df829a3551f1ab。我在这做错了什么?
有人给了我一个暗示“技巧是将SHA-1应用于代表MEID的数字,而不是代表MEID的字符串。你需要逐字节处理它,所以你必须一次给它两个十六进制数字(因为两个十六进制数字构成一个字节)并确保它们被解释为数字而不是ASCII字符“。如果这是真的,那么如何将我的字符串更改为十六进制,然后更改为字节,以便SHA1可以给我正确的结果???
答案 0 :(得分:3)
没有库,您可以按照以下示例进行操作:
In Java, how do you convert a hex string to a byte[]?
byte[] b = new BigInteger(s,16).toByteArray();
一个库(我确定有很多)也提供了这个POJava:
<dependency>
<groupId>org.pojava</groupId>
<artifactId>pojava</artifactId>
<version>2.8.1</version>
</dependency>
byte[] hexMEIDBytes=EncodingTool.hexDecode(hexMEID);
[编辑] ==============
根据您的后续问题,这是一个更完整的示例:
byte[] hexMEIDBytes = EncodingTool.hexDecode(hexMEID);
byte[] hash = HashingTool.hash(hexMEIDBytes, HashingAlgorithm.SHA);
String pESN="0x80" + EncodingTool.hexEncode(hash).substring(34).toUpperCase();
// a hexMEID value of "A0000000002329" results in a pESN value of "0x8051F1AB"
答案 1 :(得分:2)
对于字符串到十六进制:
public String StrToHex(String arg) {
return String.format("%040x", new BigInteger(arg.getBytes(//Your Charset//)));
}
对于十六进制到字节:
以下代码不适用于“0”。
public byte[] hexStrToByteArray(String s) {
int leng = s.length();
byte[] data = new byte[leng / 2];
for (int i = 0; i < leng; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
答案 2 :(得分:1)
您可以使用以下两种方法
public static synchronized String bytesToHex(byte [] buf){
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10){
strbuf.append("0");
}
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
}
public synchronized static byte[] hexToBytes(String hexString) {
byte[] b = new BigInteger(hexString,16).toByteArray();
return b;
}