ts-sdk

utils.ts 3.9KB

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