No Description

utils.ts 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { AES, enc, mode, pad } from 'crypto-js';
  2. declare global {
  3. interface Window {
  4. crcTable: number[];
  5. }
  6. }
  7. class Utils {
  8. private static code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(
  9. '',
  10. );
  11. public static crc32(str: string): number {
  12. const crcTable =
  13. window.crcTable || (window.crcTable = Utils.makeCRCTable());
  14. let crc = 0 ^ -1;
  15. for (let i = 0; i < str.length; i++) {
  16. crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xff];
  17. }
  18. return (crc ^ -1) >>> 0;
  19. }
  20. // ArrayBuffer 转为字符串,参数为 ArrayBuffer 对象
  21. public static ab2str(buf: ArrayBuffer): string {
  22. // 注意,如果是大型二进制数组,为了避免溢出,必须一个一个字符地转
  23. if (buf && buf.byteLength < 1024) {
  24. return String.fromCharCode.apply(null, new Uint8Array(buf));
  25. }
  26. const bufView = new Uint8Array(buf);
  27. const len = bufView.length;
  28. const byteStr = new Array(len);
  29. for (let i = 0; i < len; i++) {
  30. byteStr[i] = String.fromCharCode.call(null, bufView[i]);
  31. }
  32. return byteStr.join('');
  33. }
  34. // 字符串转为 ArrayBuffer 对象,参数为字符串
  35. public static str2ab(str: string): ArrayBuffer {
  36. const buf = new ArrayBuffer(str.length); // 每个字符占用2个字节
  37. const bufView = new Uint8Array(buf);
  38. for (let i = 0, strLen = str.length; i < strLen; i++) {
  39. bufView[i] = str.charCodeAt(i);
  40. }
  41. return buf;
  42. }
  43. // 解密服务端传递过来的字符串
  44. public static decrypt(data: string, key: string, iv: string): string {
  45. const binData = Utils.stringToBin(data);
  46. const base64Data = Utils.binToBase64(binData);
  47. const bytes = AES.decrypt(base64Data, enc.Latin1.parse(key), {
  48. iv: enc.Latin1.parse(iv),
  49. mode: mode.CBC,
  50. padding: pad.Pkcs7,
  51. });
  52. return bytes.toString(enc.Utf8);
  53. }
  54. // 加密字符串以后传递到服务端
  55. public static encrypt(data: string, key: string, iv: string): string {
  56. const result = AES.encrypt(data, enc.Latin1.parse(key), {
  57. iv: enc.Latin1.parse(iv),
  58. mode: mode.CBC,
  59. padding: pad.Pkcs7,
  60. });
  61. return Utils.binToString(Utils.base64ToBin(result.toString()));
  62. }
  63. // 字节数组转换为base64编码
  64. public static binToBase64(bitString: string): string {
  65. const tail = bitString.length % 6;
  66. const bitStringTemp1 = bitString.substr(0, bitString.length - tail);
  67. let result = '';
  68. let bitStringTemp2 = bitString.substr(bitString.length - tail, tail);
  69. for (let i = 0; i < bitStringTemp1.length; i += 6) {
  70. let index = parseInt(bitStringTemp1.substr(i, 6), 2);
  71. result += Utils.code[index];
  72. }
  73. bitStringTemp2 += new Array(7 - tail).join('0');
  74. if (tail) {
  75. result += Utils.code[parseInt(bitStringTemp2, 2)];
  76. result += new Array((6 - tail) / 2 + 1).join('=');
  77. }
  78. return result;
  79. }
  80. // base64编码转换为字节数组
  81. public static base64ToBin(str: string): string {
  82. let bitString = '';
  83. let tail = 0;
  84. for (let i = 0; i < str.length; i++) {
  85. if (str[i] !== '=') {
  86. let decode = this.code.indexOf(str[i]).toString(2);
  87. bitString += new Array(7 - decode.length).join('0') + decode;
  88. } else {
  89. tail++;
  90. }
  91. }
  92. return bitString.substr(0, bitString.length - tail * 2);
  93. }
  94. // 字符串转换为字节数组
  95. public static stringToBin(str: string): string {
  96. let result = '';
  97. for (let i = 0; i < str.length; i++) {
  98. let charCode = str.charCodeAt(i).toString(2);
  99. result += new Array(9 - charCode.length).join('0') + charCode;
  100. }
  101. return result;
  102. }
  103. // 字节数组转化为字符串
  104. public static binToString(bin: string): string {
  105. let result = '';
  106. for (let i = 0; i < bin.length; i += 8) {
  107. result += String.fromCharCode(parseInt(bin.substr(i, 8), 2));
  108. }
  109. return result;
  110. }
  111. private static makeCRCTable(): number[] {
  112. let c: number;
  113. let crcTable: number[] = [];
  114. for (let n = 0; n < 256; n++) {
  115. c = n;
  116. for (let k = 0; k < 8; k++) {
  117. c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
  118. }
  119. crcTable[n] = c;
  120. }
  121. return crcTable;
  122. }
  123. }
  124. export { Utils };