You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

fileData.js 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import {
  2. TextDecoder
  3. } from "../node-model/text-decoding";
  4. export function IntegerToHexString(num, nLen) {
  5. if (num == null) {
  6. let str = "";
  7. for (let i = 0; i < nLen; i++) {
  8. str += "0";
  9. }
  10. return str;
  11. }
  12. return HighAddZero(num.toString(16), nLen);
  13. }
  14. export function HighAddZero(str, nLen) {
  15. let length = str.length;
  16. let nAddLen = nLen - length;
  17. if (length > nLen) {
  18. str = str.substring(0, nLen);
  19. } else {
  20. for (let i = 0; i < nAddLen; i++) {
  21. str = "0" + str;
  22. }
  23. }
  24. return str;
  25. }
  26. const DIGITS_UPPER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
  27. 'E', 'F'
  28. ];
  29. export function HexToString(inHex) {
  30. let i;
  31. let strResult = "";
  32. for (i = 0; i < inHex.length; i++) {
  33. strResult += DIGITS_UPPER[(0xF0 & inHex[i]) >>> 4];
  34. strResult += DIGITS_UPPER[inHex[i] & 0x0F];
  35. }
  36. return strResult;
  37. }
  38. /**
  39. * 十六进制转汉字
  40. *
  41. * @param {string} data
  42. * @returns {string}
  43. */
  44. export function HexToStrig(data, charType = 1) {
  45. let str = data.substring(data.length - 2);
  46. while (str === "00") {
  47. data = data.substring(0, data.length - 2);
  48. if (data.length === 0) {
  49. return "";
  50. }
  51. str = data.substring(data.length - 2);
  52. }
  53. const asd = hexStringToByteArray(data);
  54. try {
  55. str = new TextDecoder("GBK").decode(asd);
  56. } catch (e) {
  57. console.error(e);
  58. }
  59. return str;
  60. }
  61. /**
  62. * 十六进制字符串转字节数组
  63. *
  64. * @param {string} str
  65. * @returns {Uint8Array}
  66. */
  67. export function hexStringToByteArray(str) {
  68. if (!str) {
  69. return new Uint8Array();
  70. }
  71. const result = new Uint8Array(str.length / 2);
  72. for (let i = 0; i < str.length; i += 2) {
  73. result[i / 2] = parseInt(str.substr(i, 2), 16);
  74. }
  75. return result;
  76. }
  77. /**
  78. * 十六进制转十进制
  79. *
  80. * @param {string} data
  81. * @returns {string}
  82. */
  83. export function HexToInt(data) {
  84. let num = -1;
  85. try {
  86. num = parseInt(data, 16);
  87. } catch (e) {
  88. console.error(e);
  89. }
  90. return num.toString();
  91. }
  92. function guessEncoding(bytes) {
  93. // 检查字节序列是否以 BOM(字节顺序标记)开头
  94. if (bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {
  95. return 'UTF-8';
  96. } else if (bytes[0] === 0xFE && bytes[1] === 0xFF) {
  97. return 'UTF-16BE';
  98. } else if (bytes[0] === 0xFF && bytes[1] === 0xFE) {
  99. return 'UTF-16LE';
  100. } else {
  101. // 统计每个字节的频率
  102. let freq = {};
  103. for (let i = 0; i < bytes.length; i++) {
  104. let b = bytes[i];
  105. freq[b] = freq[b] ? freq[b] + 1 : 1;
  106. }
  107. // 检查是否存在 GBK 的特定字节序列
  108. if (freq[0x81] && freq[0x81] > 0 && freq[0x40] && freq[0x40] > 0) {
  109. return 'GBK';
  110. }
  111. // 如果没有特定的 GBK 字节序列,则假设为 UTF-8
  112. return 'UTF-8';
  113. }
  114. }