private static final String toHex(byte hash[]) { if (hash == null) { return null; } StringBuffer buf = new StringBuffer(hash.length * 2); int i; for (i = 0; i < hash.length; i++) { if ((hash[i] & 0xff) < 0x10) { buf.append("0"); } buf.append(Long.toString(hash[i] & 0xff, 16)); } return buf.toString(); }
时间: 2024-02-14 22:31:04 浏览: 115
您好!这个函数是用来将字节数组转换为十六进制字符串的。它接收一个字节数组作为参数,并返回一个对应的十六进制字符串。
函数首先检查传入的字节数组是否为null,如果是,就返回null。
然后,它创建了一个StringBuffer对象,用于构建最终的十六进制字符串。为了避免字符串频繁拼接的性能开销,StringBuffer比普通的String更适合这个任务。
接下来,函数使用一个循环遍历字节数组中的每个字节。对于每个字节,它通过按位与运算(hash[i] & 0xff)将其转换为一个无符号整数,然后使用Long.toString方法将其转换为十六进制字符串。
如果转换后的十六进制字符串长度小于2(即小于0x10),函数会在字符串前面添加一个0,以保证每个字节对应的十六进制字符串都是两位数。
最后,函数返回构建好的十六进制字符串。
希望能解答您的问题!如果还有其他问题,请随时提问。
相关问题
private static String encrypt(String inputText, String algorithmName) { if (inputText == null || "".equals(inputText.trim())) { throw new IllegalArgumentException("请输入要加密的内容"); } if (algorithmName == null || "".equals(algorithmName.trim())) { algorithmName = "md5"; } String encryptText = null; try { MessageDigest m = MessageDigest.getInstance(algorithmName); m.update(inputText.getBytes("UTF8")); byte[] s = m.digest(); return hex(s); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return encryptText; } /** * 返回十六进制字符串 */ private static String hex(byte[] arr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < arr.length; ++i) { sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100) .substring(1, 3)); } return sb.toString(); }使用Python重新写
以下是使用Python重新编写的代码:
```python
import hashlib
def encrypt(inputText, algorithmName="md5"):
if not inputText:
raise ValueError("请输入要加密的内容")
algorithmName = algorithmName.lower()
if algorithmName not in hashlib.algorithms_guaranteed:
raise ValueError("不支持的加密算法")
m = hashlib.new(algorithmName)
m.update(inputText.encode("utf-8"))
s = m.digest()
return hex(s)[2:]
def hex(arr):
return ''.join(format(x, '02x') for x in arr)
```
这是一个更加Pythonic的实现,使用了Python内置的hashlib模块来进行加密。函数的参数和返回值与原代码相同。
public static String hmacsha256(String plainStr, String key) { SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(Charset.forName("UTF-8")), "HmacSHA256"); Mac mac=null; try { mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); } catch (NoSuchAlgorithmException | InvalidKeyException e) { e.printStackTrace(); } byte digest[] = mac.doFinal(plainStr.getBytes(Charset.forName("UTF- 8"))); return new StringBuilder().append(byte2HexStr(digest)).toString(); } public static String byte2HexStr(byte array[]) { return array != null ? new String(Hex.encodeHex(array)) : null; } java to PHP
Here's the PHP equivalent of the Java code for computing HMAC-SHA256:
```
function hmacsha256($plainStr, $key) {
$secretKey = utf8_encode($key);
$digest = hash_hmac('sha256', utf8_encode($plainStr), $secretKey, true);
return bin2hex($digest);
}
```
Note that in PHP, the `hash_hmac` function is used to compute the HMAC with SHA256. The third parameter of `hash_hmac` is set to `true` to get the output as raw binary data. The `bin2hex` function is then used to convert the binary data to a hexadecimal string, which is the same format as the output of the `byte2HexStr` function in the Java code.
Also note that in PHP, strings are already represented as Unicode, so there's no need to convert the key and plain string to UTF-8 encoding using the `Charset.forName("UTF-8")` method.
阅读全文