diff options
| author | Erick Tryzelaar <[email protected]> | 2013-08-15 08:20:47 -0700 |
|---|---|---|
| committer | Erick Tryzelaar <[email protected]> | 2013-08-15 08:20:47 -0700 |
| commit | 08374ec0546d42eb86a867adcd497cf5e874d0b8 (patch) | |
| tree | 6d73d8ff2eb672e93453b1967a1e2e60cdaecd50 /hex.rs | |
| parent | Remove pkey::ANYKEY (diff) | |
| parent | Update to latest rust master (0.8-pre 927aff1) (diff) | |
| download | rust-openssl-08374ec0546d42eb86a867adcd497cf5e874d0b8.tar.xz rust-openssl-08374ec0546d42eb86a867adcd497cf5e874d0b8.zip | |
Merge remote-tracking branch 'remotes/kballard/master'
Conflicts:
crypto.rs
hash.rs
pkcs5.rs
pkey.rs
rand.rs
symm.rs
Diffstat (limited to 'hex.rs')
| -rw-r--r-- | hex.rs | 87 |
1 files changed, 87 insertions, 0 deletions
@@ -0,0 +1,87 @@ +/* + * Copyright 2013 Jack Lloyd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use std::vec; + +pub trait ToHex { + fn to_hex(&self) -> ~str; +} + +impl<'self> ToHex for &'self [u8] { + fn to_hex(&self) -> ~str { + + let chars = "0123456789ABCDEF".iter().collect::<~[char]>(); + + let mut s = ~""; + + for i in range(0u, self.len()) { + + let x = self[i]; + + let xhi = (x >> 4) & 0x0F; + let xlo = (x ) & 0x0F; + + s.push_char(chars[xhi]); + s.push_char(chars[xlo]); + } + + s + } +} + +pub trait FromHex { + fn from_hex(&self) -> ~[u8]; +} + +impl<'self> FromHex for &'self str { + fn from_hex(&self) -> ~[u8] { + let mut vec = vec::with_capacity(self.len() / 2); + + for (i,c) in self.iter().enumerate() { + let nibble = + if c >= '0' && c <= '9' { (c as u8) - 0x30 } + else if c >= 'a' && c <= 'f' { (c as u8) - (0x61 - 10) } + else if c >= 'A' && c <= 'F' { (c as u8) - (0x41 - 10) } + else { fail!(~"bad hex character"); }; + + if i % 2 == 0 { + vec.push(nibble << 4); + } + else { + vec[i/2] |= nibble; + } + } + + vec + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + pub fn test() { + + assert!([05u8, 0xffu8, 0x00u8, 0x59u8].to_hex() == ~"05FF0059"); + + assert!("00FFA9D1F5".from_hex() == ~[0, 0xff, 0xa9, 0xd1, 0xf5]); + + assert!("00FFA9D1F5".from_hex().to_hex() == ~"00FFA9D1F5"); + } + + +} |