使用字节将字母数字代码解码为键值对象

2024-04-17

我有一个来自 CS:GO 游戏的“十字准线代码”:CSGO-O4Jsi-V36wY-rTMGK-9w7qF-jQ8WB

我可以使用此函数解码一些值:

import BigNumber from 'bignumber.js';

// Intentionally no 0 and 1 number in DICTIONARY
const DICTIONARY = 'ABCDEFGHJKLMNOPQRSTUVWXYZabcdefhijkmnopqrstuvwxyz23456789';
const DICTIONARY_LENGTH = DICTIONARY.length;
const SHARECODE_PATTERN = /CSGO(-?[\w]{5}){5}$/;

function bigNumberToByteArray(big) {
  const str = big.toString(16).padStart(36, '0');
  const bytes = [];
  for (let i = 0; i < str.length; i += 2) {
    bytes.push(parseInt(str.slice(i, i + 2), 16));
  }

  return bytes;
}


function bytesToInt32(bytes) {
  let number = 0;
  for (let i = 0; i < bytes.length; i++) {
    number += bytes[i];
    if (i < bytes.length - 1) {
      number = number << 8;
    }
  }

  return number;
}

const decode = shareCode => {
  if (!shareCode.match(SHARECODE_PATTERN)) {
    throw new Error('Invalid share code');
  }

  shareCode = shareCode.replace(/CSGO|-/g, '');
  const chars = Array.from(shareCode).reverse();
  let big = new BigNumber(0);

  for (let i = 0; i < chars.length; i++) {
    big = big.multipliedBy(DICTIONARY_LENGTH).plus(DICTIONARY.indexOf(chars[i]));
  }

  const bytes = bigNumberToByteArray(big);

  return {
    cl_crosshaircolor_r: bytesToInt32(bytes.slice(4, 5).reverse()),
    cl_crosshaircolor_g: bytesToInt32(bytes.slice(5, 6).reverse()),
    cl_crosshaircolor_b: bytesToInt32(bytes.slice(6, 7).reverse())
  };
};

console.log(decode('CSGO-O4Jsi-V36wY-rTMGK-9w7qF-jQ8WB'))
// { cl_crosshaircolor_r: 50, cl_crosshaircolor_g: 250, cl_crosshaircolor_b: 84

我不知道如何获取其余的值,因为它没有显示正确的数字。

我应该从中得到这些值:

{
    cl_crosshair_drawoutline: 0,
    cl_crosshair_dynamic_maxdist_splitratio: 0.3,
    cl_crosshair_dynamic_splitalpha_innermod: 0.6,
    cl_crosshair_dynamic_splitalpha_outermod: 0.8,
    cl_crosshair_dynamic_splitdist: 127,
    cl_crosshair_outlinethickness: 1.5,
    cl_crosshair_t: 1,
    cl_crosshairalpha: 200,
    cl_crosshaircolor: 5,
    cl_crosshaircolor_b: 84,
    cl_crosshaircolor_g: 250,
    cl_crosshaircolor_r: 50,
    cl_crosshairdot: 1,
    cl_crosshairgap: 1,
    cl_crosshairgap_useweaponvalue: 0,
    cl_crosshairsize: 33,
    cl_crosshairstyle: 2,
    cl_crosshairthickness: 4.1,
    cl_crosshairusealpha: 0,
    cl_fixedcrosshairgap: -10
}

其他示例:

CSGO-tEAHu-36Ro8-Oyms7-NVvnV-F6XDJ
{
    cl_crosshair_drawoutline: 0,
    cl_crosshair_dynamic_maxdist_splitratio: 0.1,
    cl_crosshair_dynamic_splitalpha_innermod: 0.8,
    cl_crosshair_dynamic_splitalpha_outermod: 0.6,
    cl_crosshair_dynamic_splitdist: 13,
    cl_crosshair_outlinethickness: 2,
    cl_crosshair_t: 0,
    cl_crosshairalpha: 250,
    cl_crosshaircolor: 5,
    cl_crosshaircolor_b: 90,
    cl_crosshaircolor_g: 255,
    cl_crosshaircolor_r: 55,
    cl_crosshairdot: 1,
    cl_crosshairgap: -2,
    cl_crosshairgap_useweaponvalue: 0,
    cl_crosshairsize: 10,
    cl_crosshairstyle: 2,
    cl_crosshairthickness: 4.5,
    cl_crosshairusealpha: 1,
    cl_fixedcrosshairgap: 12
}

CSGO-rGhtd-eWuUm-EWVO7-72rvk-zqAUM
{
    cl_crosshair_drawoutline: 1,
    cl_crosshair_dynamic_maxdist_splitratio: 0.9,
    cl_crosshair_dynamic_splitalpha_innermod: 0.5,
    cl_crosshair_dynamic_splitalpha_outermod: 0.6,
    cl_crosshair_dynamic_splitdist: 12,
    cl_crosshair_outlinethickness: 0.5,
    cl_crosshair_t: 0,
    cl_crosshairalpha: 189,
    cl_crosshaircolor: 2,
    cl_crosshaircolor_b: 123,
    cl_crosshaircolor_g: 229,
    cl_crosshaircolor_r: 67,
    cl_crosshairdot: 1,
    cl_crosshairgap: 3,
    cl_crosshairgap_useweaponvalue: 0,
    cl_crosshairsize: 7,
    cl_crosshairstyle: 4,
    cl_crosshairthickness: 1.2,
    cl_crosshairusealpha: 0,
    cl_fixedcrosshairgap: -5
}

CSGO-wQ3FD-JiRVa-kKcFt-6XfbF-uMD7K
{
    cl_crosshair_drawoutline: 1,
    cl_crosshair_dynamic_maxdist_splitratio: 0.9,
    cl_crosshair_dynamic_splitalpha_innermod: 0.5,
    cl_crosshair_dynamic_splitalpha_outermod: 0.6,
    cl_crosshair_dynamic_splitdist: 12,
    cl_crosshair_outlinethickness: 1.5,
    cl_crosshair_t: 1,
    cl_crosshairalpha: 158,
    cl_crosshaircolor: 5,
    cl_crosshaircolor_b: 198,
    cl_crosshaircolor_g: 182,
    cl_crosshaircolor_r: 91,
    cl_crosshairdot: 1,
    cl_crosshairgap: 1.4,
    cl_crosshairgap_useweaponvalue: 1,
    cl_crosshairsize: 6.4,
    cl_crosshairstyle: 4,
    cl_crosshairthickness: 1.8,
    cl_crosshairusealpha: 1,
    cl_fixedcrosshairgap: -5
}

性能范围:

{
    // acts like boolean
    cl_crosshair_drawoutline: {
        min: 0,
        max: 1
    },
    cl_crosshair_dynamic_maxdist_splitratio: {
        min: 0,
        step: 0.1, // e.g: 0, 0.1, 0.2, 0.3 etc.
        max: 1
    },
    cl_crosshair_dynamic_splitalpha_innermod: {
        min: 0,
        step: 0.1, // e.g: 0, 0.1, 0.2, 0.3 etc.
        max: 1
    },
    cl_crosshair_dynamic_splitalpha_outermod: {
        min: 0.3,
        step: 0.1, // 0.3, 0.4, 0.5 etc.
        max: 1
    },
    cl_crosshair_dynamic_splitdist: {
        min: 0,
        step: 1, // e.g: 0, 1, 2, 3, ..., 127
        max: 127
    },
    cl_crosshair_outlinethickness: {
        min: 0,
        step: 0.5, // e.g: 0, 0.5, 1, ..., 3
        max: 3
    },
    // acts like boolean
    cl_crosshair_t: {
        min: 0,
        max: 1
    },
    cl_crosshairalpha: {
        min: 0,
        step: 1, // e.g: 1, 2, 3, ..., 255
        max: 255
    },
    cl_crosshaircolor: {
        min: 0,
        step: 1, // e.g: 1, 2, 3, ..., 7
        max: 7
    },
    cl_crosshaircolor_b: {
        min: 0,
        step: 1, // e.g: 1, 2, 3, ..., 255
        max: 255
    },
    cl_crosshaircolor_g: {
        min: 0,
        step: 1, // e.g: 1, 2, 3, ..., 255
        max: 255
    },
    cl_crosshaircolor_r: {
        min: 0,
        step: 1, // e.g: 1, 2, 3, ..., 255
        max: 255
    },
    // acts like boolean
    cl_crosshairdot: {
        min: 0,
        max: 1
    },
    cl_crosshairgap: {
        min: -12.8,
        step: 0.1, // e.g: 10, 10.1 etc.
        max: 12.7
    },
    // acts like boolean
    cl_crosshairgap_useweaponvalue: {
        min: 0,
        max: 1
    },
    cl_crosshairsize: {
        min: 0,
        step: 0.1, // e.g: 0, 0.1, 0.2, 14.4 etc.
        max: 819.100037 // can't say why such an unusual output
    },
    cl_crosshairstyle: {
        min: 0,
        step: 1, // e.g: 1, 2, 3, ..., 7
        max: 7
    }
    cl_crosshairthickness: {
        min: 0,
        step: 0.1, // e.g: 0, 0.1, 0.2, ..., 6.3
        max: 6.3
    }
    // acts like boolean
    cl_crosshairusealpha: {
        min: 0,
        max: 1
    },
    cl_fixedcrosshairgap: {
        min: -12.8,
        step: 0.1, // e.g: 10, 10.1 etc.
        max: 12.7
    }
}

值一次改变一个:

Default: CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN
{
    cl_crosshair_drawoutline: 1,
    cl_crosshair_dynamic_maxdist_splitratio: 0.3,
    cl_crosshair_dynamic_splitalpha_innermod: 1,
    cl_crosshair_dynamic_splitalpha_outermod: 0.5,
    cl_crosshair_dynamic_splitdist: 7,
    cl_crosshair_outlinethickness: 1,
    cl_crosshair_t: 0,
    cl_crosshairalpha: 200,
    cl_crosshaircolor: 1,
    cl_crosshaircolor_b: 50,
    cl_crosshaircolor_g: 250,
    cl_crosshaircolor_r: 50,
    cl_crosshairdot: 1,
    cl_crosshairgap: 1,
    cl_crosshairgap_useweaponvalue: 0,
    cl_crosshairsize: 5,
    cl_crosshairstyle: 2,
    cl_crosshairthickness: 0.5,
    cl_crosshairusealpha: 1,
    cl_fixedcrosshairgap: 3
}

The only value changed is described beside, rest stays the same as default 
above.

cl_crosshair_drawoutline
1   = CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN
0   = CSGO-of9RX-KD5Fp-4kb7Q-EoVSz-cb7nM

cl_crosshair_dynamic_maxdist_splitratio
0   = CSGO-Vtkiw-zkx82-6AYMS-9OXdk-6yXHK
0.5 = CSGO-Trqu8-WUQCn-5MfrP-KDUGF-CFeKP
1   = CSGO-QMSEL-6KJoK-vvajh-WpPKZ-Bh2ED

cl_crosshair_dynamic_splitalpha_innermod
0   = CSGO-Tabp9-L98iF-Btmcu-64Das-MdaEC
0.5 = CSGO-HRKjJ-R5sqr-Q6t9r-GsADN-SthGH
1   = CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN

cl_crosshair_dynamic_splitalpha_outermod
0.3 = CSGO-RBqva-DumOx-WPvGy-cDxic-5zcBN
0.7 = CSGO-jNCMK-q6UXz-pA93e-FAGu4-2GzQN
1   = CSGO-DWSPa-oEJum-4Tn8R-SrTXs-jxkbN

cl_crosshair_dynamic_splitdist
0   = CSGO-Dxzuf-AUuea-G7enM-c3Zza-sBhrM
50  = CSGO-LcTca-Laf43-7pmXZ-jnJGu-oS9zP
127 = CSGO-xa4d4-MN8pW-aETR7-jhzeQ-6DjjD

cl_crosshair_outlinethickness
0   = CSGO-aQUWL-7ysnT-Ve8rS-PHXDY-5zcBN
1.5 = CSGO-LhmCW-jzV4T-m6T4z-SOtbU-nhPNN
3   = CSGO-5x4rh-N29JU-3VqEY-WUF3Q-VPBYN

cl_crosshair_t
0   = CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN
1   = CSGO-iyOcd-YLrjN-8xQqU-xZa3G-zjRFE

cl_crosshairalpha
0   = CSGO-sQOF4-9RKDe-sLeFU-wqGMn-uonpQ
200 = CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN
255 = CSGO-BqGwL-hirNt-AX6Dy-YbCoB-fFDmQ

cl_crosshaircolor
0 = CSGO-4KA8L-stYs2-aqTxt-3R3GF-KZEFN
4 = CSGO-C8ZDo-TJrEr-uafja-dOLSe-GqZUN
7 = CSGO-JxAn9-Qa5UE-AvLpN-r6X6T-yWMfN

cl_crosshaircolor_b
0   = CSGO-8fuTL-n9Uqy-iF6pY-6tOYX-brNAK
200 = CSGO-xWpEr-keTtj-QmeUw-XpE3a-FCPcF
255 = CSGO-W58Ja-mo8Q6-e7Phv-3mK2v-NJn6J

cl_crosshaircolor_g
0   = CSGO-BvDs8-JUwK4-54sLY-c745T-yWMfN
200 = CSGO-h7whC-Uiy99-WKxr3-HLJYX-brNAK
255 = CSGO-Wnbcy-QvJ47-65Eqz-MQUXs-jxkbN

cl_crosshaircolor_r
0   = CSGO-uznHJ-WZpew-rQpJS-p2F8W-brNAK
200 = CSGO-aaBpx-XNVPr-zES6H-MTdMc-FCPcF
255 = CSGO-nOKuX-kEo8c-hBOZh-WaOpx-NJn6J

cl_crosshairdot
0 = CSGO-c8tdf-txA5L-UFDY3-zuu69-i6OJM
1 = CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN

cl_crosshairgap
-12.8 = CSGO-N5fyF-u3u8M-4jU9j-O9vLu-aSYbD
0     = CSGO-qis8G-DpZxE-Z9QeN-upthN-OSveM
12.7  = CSGO-XuT3W-BvVvv-cvEFo-cM8iA-CtxXD

cl_crosshairgap_useweaponvalue
0 = CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN
1 = CSGO-zYEbz-m4Zmk-5MfrP-KDUGF-CFeKP

cl_crosshairsize
0 = CSGO-hzFpv-XtPmX-wHSxa-LvOYX-brNAK
100 = CSGO-Cn2cE-Mau97-N4rOC-typ7o-ayzpH
819 = CSGO-GC68x-Jh9L4-73R6P-zjXN8-WGSyL
819.100037 = CSGO-MjLui-qkX6J-CUzmL-Pybui-mp33L

cl_crosshairstyle
0 = CSGO-TjyO2-rj2yR-OWps8-pjocQ-asS4M
4 = CSGO-ho3st-BGGwV-y3ERW-4bPzG-VPBYN
7 = CSGO-875F5-AdfP5-QfXa5-S3qGu-vnhvN

cl_crosshairthickness
0   = CSGO-r6TO2-WsYFC-K6GCD-RVj6o-MKsyM
3.1 = CSGO-ToYxk-5EQKD-ciNhr-tn3ya-kq8vO
6.3 = CSGO-LAYaa-DEf8T-2n2tR-mKQRz-OwxwQ

cl_crosshairusealpha
0 = CSGO-GfZhN-2sjMv-t8iFe-hcMv4-Gw8GJ
1 = CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN

cl_fixedcrosshairgap
-12.80 = CSGO-OPDHV-Ab3cf-pmoFG-8ecMS-eNqRP
0      = CSGO-NJ6Z7-bRb8Y-qSBRv-cZ8Ys-7xSOG
12.70  = CSGO-SSCsS-u4nYT-rKGYL-iRYoq-QoFOP

干得好。添加这个parseBytes功能、修改decode如图所示,并保持其余代码不变。

function parseBytes(bytes) {
  return {
    cl_crosshairgap: Int8Array.of(bytes[2])[0] / 10.0,

    cl_crosshair_outlinethickness: (bytes[3] & 7) / 2.0,

    cl_crosshaircolor_r: bytes[4],
    cl_crosshaircolor_g: bytes[5],
    cl_crosshaircolor_b: bytes[6],
    cl_crosshairalpha: bytes[7],
    cl_crosshair_dynamic_splitdist: bytes[8],

    cl_fixedcrosshairgap: Int8Array.of(bytes[9])[0] / 10.0,

    cl_crosshaircolor: bytes[10] & 7,
    cl_crosshair_drawoutline: bytes[10] & 8 ? 1 : 0,
    cl_crosshair_dynamic_splitalpha_innermod: ((bytes[10] & 0xF0) >> 4) / 10.0,

    cl_crosshair_dynamic_splitalpha_outermod: (bytes[11] & 0xF) / 10.0,
    cl_crosshair_dynamic_maxdist_splitratio: ((bytes[11] & 0xF0) >> 4) / 10.0,

    cl_crosshairthickness: (bytes[12] & 0x3F) / 10.0,

    cl_crosshairstyle: (bytes[13] & 0xE) >> 1,
    cl_crosshairdot: bytes[13] & 0x10 ? 1 : 0,
    cl_crosshairgap_useweaponvalue: bytes[13] & 0x20 ? 1 : 0,
    cl_crosshairusealpha: bytes[13] & 0x40 ? 1 : 0,
    cl_crosshair_t: bytes[13] & 0x80 ? 1 : 0,

    cl_crosshairsize: (((bytes[15] & 0x1f) << 8) + bytes[14]) / 10.0
  };
}

const decode = shareCode => {
  if (!shareCode.match(SHARECODE_PATTERN)) {
    throw new Error('Invalid share code');
  }

  shareCode = shareCode.replace(/CSGO|-/g, '');
  const chars = Array.from(shareCode).reverse();
  let big = new BigNumber(0);

  for (let i = 0; i < chars.length; i++) {
    big = big.multipliedBy(DICTIONARY_LENGTH).plus(DICTIONARY.indexOf(chars[i]));
  }
  
  return parseBytes(bigNumberToByteArray(big));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用字节将字母数字代码解码为键值对象 的相关文章

随机推荐