2017-11-03 17 views
-1

우리의 데이터베이스에서 IP 주소는 바이너리 (16)로 저장되며 ipv6입니다. 클라이언트 측에서는 8 진수 코드와 인쇄 가능한 ASCII 문자가 혼합 된 문자열로 표시됩니다. 인쇄 가능한 ASCII 문자 (범위 [0x20, 0x7e])의 범위에있는 바이트는 백 슬래시 ('\')를 제외하고는 해당 ASCII 문자로 표시되며 '\'로 이스케이프됩니다. 다른 모든 바이트 값은 해당하는 8 진수 값으로 표시됩니다. 예를 들어 ASCII {a, \, b, c} 인 바이트 {97,92,98,99}는 텍스트로 'a \ bc'로 변환됩니다.하이브리드 8 진수를 자바 스크립트에서 사람이 읽을 수있는 IPv6로 변환하려면 어떻게해야합니까?

"\ 001 \ 015 270 \ 000 \ 000 \ 000 \ 000 \ 000 \ 000 \ 014Az \ 000 \ 010 \ 010 \"

문제는 나는 사람이 읽을 수의 IPv6처럼 보여 드리고자한다 . 몇 가지 라이브러리를 시도했지만 입력으로 바이트 배열이 필요합니다.

하이브리드 8 진수를 바이트 배열로 변환 한 다음 https://www.npmjs.com/package/ipaddr.js을 사용하여 IPv6으로 변환하여 문제를 해결할 수 있다고 생각합니다.

위의 문자열은 십진수 값으로 바이트 배열로 변환됩니다. [32, 1, 13, 184, 0, 0, 0, 8, 8, 0, 12, 65, 122, 0] 공백은 32 ascii, A = 65 및 z = 122

임 하이브리드 8 진수를 바이트 배열로 구문 분석하는 함수에서 작동합니다. 나는 준비가되면 나눌 것이다.

+0

[MySQL에서 저장을 위해 IPv6을 이진 파일로 변환하는 방법] (https://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql)) – DarkBee

+1

그래서 ... 스택 오버플로의 자원 봉사자에게 무엇을 원하십니까? 미스터리 고기 데이터를 가져 와서 필레 미뇽으로 덮는 코드를 작성하려면? :) 당신은 당신이 무엇을 얻고 있는지, 출력을 원하는 것 등 정확하게 알려줄 필요가 있습니다. [mcve]와 관련하여 정보를 얻기 위해 [ask]를 읽으십시오. –

+0

@MikeMcCaughan 문자열의 형식과 IPv6로 변환하는 방법을 알아 내고 싶었지만 형식이 무엇인지 알아 냈습니다. 덕분에 – pxp

답변

0

파서 솔루션은

const input = " \\001\\015\\270\\000\\000\\000\\000\\000\\010\\010\\000\\014Az\\000"; 
const output = Uint8Array.from(input.match(/\\(\d\d\d)|\\([ -~])|\\(\\)|([ -~])/g), x => 
    x.length == 1 ? x.charCodeAt(0) : x.length == 2 ? 92 : parseInt(x.slice(1), 8) 
); 
console.log(output); // Uint8Array(16) [32,1,13,184,0,0,0,0,0,8,8,0,12,65,122,0] 

이 될 수 있지만, 정말 같은 16 진수 문자열, base64로 인코딩 된 문자열 또는 숫자의 단지 배열로 다른 (쉽게 구문 분석) 형식을 사용하는 것이 좋습니다.

0

Binary(16)에서 IPv6이 먼저 디코딩되었는지 확인하고 inet6_pton() 함수와 함께 저장되지만 디코딩하지 않고 반환하는 것처럼 보입니다.

+0

IPv6는 바이너리 (16)로 저장할 수 있습니다. 128 비트를 필요로하므로 정수로 저장할 수 없습니다. – DarkBee

+0

@DarkBee, 예, inet6_pton을 잊어 버렸습니다. 대답이 업데이트되었습니다. 감사. – KorbenDallas

+0

@KorbenDallas 쿼리 수준에서 바이너리를 디코딩 할 수 없으며, 클라이언트에서 얻은 것과 함께 작업해야합니다. 즉, 하이브리드 8 진수입니다. 감사합니다. – pxp