如何解决大端十六进制数对话
我有以下 4 个字节的十六进制字符串 (38 01 02 00),预期输出是 (201.38) 十进制,就像第一个输入被反转一样。 如果给出 (89 00 00 00) 那么预期的结果将是 (0.89)
我不知道这段对话的数学名称。
- 我曾尝试将 Big-endian 转换为 little-endian,但结果以 (00020138) 失败。
- 我尝试编写了一个简单的方法,但结果仍然是错误的 (1492992770)
crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: The AuthorizationPolicy named: 'SuperAdmin' was not found.
System.InvalidOperationException: The AuthorizationPolicy named: 'SuperAdmin' was not found.
at Microsoft.AspNetCore.Authorization.AuthorizationPolicy.CombineAsync(IAuthorizationPolicyProvider policyProvider,IEnumerable`1 authorizeData)
at Microsoft.AspNetCore.Components.Authorization.AuthorizeViewCore.IsAuthorizedAsync(ClaimsPrincipal user)
at Microsoft.AspNetCore.Components.Authorization.AuthorizeViewCore.OnParametersSetAsync()
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle) blazor.webassembly.js:1:14889
解决方法
似乎是 BCD 编码(二进制编码的十进制),其中每个 4 字节组代表一位小数。
并且字节顺序是小端 - 它从最低有效字节开始。
我所看到的一切都表明小数点在一个固定的位置,但这只是一个猜测。
因此,您第一次尝试的结果很接近。只需将其除以 100,即可完成。
,在@Ralf Kleberhoff 的帮助下解决了这个问题
- 我先反转了十六进制输入
- 将输出除以 100
public static String reverse(final String originalHex) {
final int lengthInBytes = originalHex.length() / 2;
final char[] chars = new char[lengthInBytes * 2];
for (int index = 0; index < lengthInBytes; index++) {
final int reversedIndex = lengthInBytes - 1 - index;
chars[reversedIndex * 2] = originalHex.charAt(index * 2);
chars[reversedIndex * 2 + 1] = originalHex.charAt(index * 2 + 1);
}
return new String(chars);
}
final float f = Float.parseFloat(reverse("89000000"));
System.out.println(f / 100);
- 给定的输入是 89000000,结果是预期的 0.89。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。