49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
|
import { MtArgumentError } from '@mtcute/core'
|
||
|
|
||
|
export function parseIpFromBytes(data: Uint8Array): string {
|
||
|
if (data.length === 4) {
|
||
|
return `${data[0]}.${data[1]}.${data[2]}.${data[3]}`
|
||
|
}
|
||
|
|
||
|
if (data.length === 16) {
|
||
|
let res = ''
|
||
|
|
||
|
for (let i = 0; i < 16; i += 2) {
|
||
|
res += data[i].toString(16).padStart(2, '0')
|
||
|
res += data[i + 1].toString(16).padStart(2, '0')
|
||
|
if (i < 14) res += ':'
|
||
|
}
|
||
|
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
throw new MtArgumentError('Invalid IP address length')
|
||
|
}
|
||
|
|
||
|
export function serializeIpv4ToBytes(ip: string, buf: Uint8Array) {
|
||
|
const parts = ip.split('.')
|
||
|
|
||
|
if (parts.length !== 4) {
|
||
|
throw new MtArgumentError('Invalid IPv4 address')
|
||
|
}
|
||
|
|
||
|
buf[0] = Number(parts[0])
|
||
|
buf[1] = Number(parts[1])
|
||
|
buf[2] = Number(parts[2])
|
||
|
buf[3] = Number(parts[3])
|
||
|
}
|
||
|
|
||
|
export function serializeIpv6ToBytes(ip: string, buf: Uint8Array) {
|
||
|
const parts = ip.split(':')
|
||
|
|
||
|
if (parts.length !== 8) {
|
||
|
throw new MtArgumentError('Invalid IPv6 address')
|
||
|
}
|
||
|
|
||
|
for (let i = 0; i < 8; i++) {
|
||
|
const val = parseInt(parts[i], 16)
|
||
|
buf[i * 2] = val >> 8
|
||
|
buf[i * 2 + 1] = val & 0xff
|
||
|
}
|
||
|
}
|