2014-04-24 2 views
0

64 비트 증기 ID를 32 비트 계정 ID로 변환하려면 어떻게해야합니까? Steam이 숫자의 처음 32 비트를 사용한다고 말하지만 Node에서 어떻게 이것을합니까?64 비트 Steam ID를 32 비트 계정 ID로 변환

64 비트 int를 저장하기 위해 BigNumber를 사용해야합니까?

+1

예, BigNumber 라이브러리를 사용해야합니다. Javascript'number'는 모두 64 비트 IEEE 부동 소수점 숫자입니다. 자바 스크립트에서'76561197991791363 === 76561197991791360'을주의하십시오. – Paulpro

+0

@ YTowOnt9 방금 알아 챘습니다. 마지막 '3'이 특히 선택되지 않은 이유는 무엇입니까? 숫자가 실제로 한 자릿수가 너무 큽니까? –

+0

이것은'0.1 + 0.2! == 0.3'과 비슷한 두배의 내부 표현입니다. [이 질문을 참조하십시오] (http://stackoverflow.com/q/588004/772035). – Paulpro

답변

3

64 비트 Steam ID를 32 비트 계정 ID로 변환하려면 64 비트 ID에서 76561197960265728을 뺍니다.

노드에 bigNumber이 필요합니다

bignumber = require("bignumber.js"); 
console.log(bignumber('76561197991791363').minus('76561197960265728')) 
1

가 여기에 내가 무엇을 최대 온입니다. 저는 어제 JavaScript를 배우기 시작했습니다. (C++ 배경에서 왔고, 타입없이 작업하는 것에 익숙하지 않았습니다.) 그래서 언어로 뭔가 어리석은 짓을하면 정정 해주세요. 나는 나의 자신의 증기 ID로 그것을 시험했고 그것은 작동하는 것처럼 보인다.

// NOTE: Functions can take in a steamID in its packed 64-bit form 
// (community ID starting with 765), its modern form with or without 
// either or both brackets, and its legacy form. SteamID's that 
// contain letters (e.g. STEAM_0... or [U:1...) are not case-sensitive. 

// Dependencies: BigInteger library, available from http://silentmatt.com/biginteger/ 

// Global variable used by all conversion functions 
var STEAM_BASELINE = '76561197960265728'; 

// IN: String containing a steamID in any of the 3 formats 
// OUT: String containing the steamID as a community ID (64-bit packed ID) 
function ConvertToPacked(inputID) 
{ 
    var output = "unknown"; 

    // From packed 
    if(inputID.match(/^765/) && inputID.length > 15) 
    { 
     output = inputID; 
    } 

    // From modern 
    else if(inputID.match(/^\[U:1:/i) || inputID.match(/^U:1:/i)) 
    { 
     var numericPortion = inputID.replace(/^\[U:1:|^U:1:/i,'').replace(/\]/,''); 
     output = BigInteger.add(numericPortion, STEAM_BASELINE).toString(); 
    } 

    // From legacy 
    else if(inputID.match(/^STEAM_0:[0-1]:/i)) 
    { 
     var splitID = inputID.split(":"); 
     var product = BigInteger.multiply(splitID[2],2); 
     var sum = BigInteger.add(product, STEAM_BASELINE); 
     output = BigInteger.add(sum, splitID[1]).toString(); 
    } 

    return output; 
} 

// IN: String containing a steamID in any of the 3 formats 
// OUT: String containing the steamID in the modern format (e.g. [U:1:123456]) 
function ConvertToModern(inputID) 
{ 
    var output = "unknown"; 

    // From packed 
    if(inputID.match(/^765/) && inputID.length > 15) 
    { 
     output = "[U:1:" + BigInteger.subtract(inputID, STEAM_BASELINE).toString() + "]"; 
    } 

    // From modern 
    else if(inputID.match(/^\[U:1:/i) || inputID.match(/^U:1:/i)) 
    { 
     var numericPortion = inputID.replace(/^\[U:1:|^U:1:/i,'').replace(/\]/,''); 
     output = "[U:1:" + numericPortion + "]"; 
    } 

    // From legacy 
    else if(inputID.match(/^STEAM_0:[0-1]:/i)) 
    { 
     var splitID = inputID.split(":"); 
     var numeric = BigInteger.add(BigInteger.multiply(splitID[2],2), splitID[1]); 
     output = "[U:1:" + numeric.toString() + "]";   
    } 

    return output; 
} 

// IN: String containing a steamID in any of the 3 formats 
// OUT: String containing the steamID in the legacy format (e.g. STEAM_0:0:123456) 
function ConvertToLegacy(inputID) 
{ 
    var output = "unknown" 

    // From packed 
    if(inputID.match(/^765/) && inputID.length > 15) 
    {   
     var z = BigInteger.divide(BigInteger.subtract(inputID, STEAM_BASELINE), 2); 
     var y = BigInteger.remainder(inputID, 2); 
     output = 'STEAM_0:' + y.toString() + ':' + z.toString(); 
    } 
    // From modern 
    else if(inputID.match(/^\[U:1:/i) || inputID.match(/^U:1:/i)) 
    { 
     var numericPortion = inputID.replace(/^\[U:1:|^U:1:/i,'').replace(/\]/,''); 
     var z = BigInteger.divide(numericPortion, 2); 
     var y = BigInteger.remainder(numericPortion, 2); 
     output = 'STEAM_0:' + y.toString() + ':' + z.toString(); 
    } 
    // From legacy 
    else if(inputID.match(/^STEAM_0:[0-1]:/i)) 
    { 
     output = inputID.toUpperCase(); 
    } 

    return output; 
} 
+0

node-dota2에는 이런 종류의 기능이 있습니다. –

+0

http://dev.dota2.com/showthread.php? t = 58317에는 나쁜 정보가 있습니다.이 답변은 완벽합니다. 저는 밸브 오피스와 함께 비트 시프트를 포함한 다양한 알고리즘을 시도하면서 약 5 시간을 낭비했습니다. –