2014-10-03 5 views
1

녹의 특성 개념을 이해하는 데 몇 가지 문제가 있습니다. 나는녹에서 Base64로 16 진수 값을 변환하는 방법

extern crate serialize; 

use serialize::base64::{ToBase64, STANDARD}; 
use serialize::hex::{FromHex, ToHex}; 

fn main() { 
    let stringOfText = "This is a String"; 
    let mut config = STANDARD; 

    println!("String to base64 = {}", stringOfText.as_bytes().to_base64(config)); 

    // Can't figure out this 

블라디미르 제공하는 솔루션은 0X 표기 16 진수 값 작동 Base64로에 대한 간단한 16 진수 값을 인코딩하려고하지만 운, 여기에 (도 Base64로에 문자열의 예와 함께) 내 코드입니다 있어요. 처음에는 문자열로 Vec<u8>를 변환 할 생각 다음을 사용

extern crate serialize; 

use serialize::base64::{ToBase64, STANDARD}; 
use serialize::hex::{FromHex, ToHex}; 
fn main() { 
    let stringOfText = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"; 
    let mut config = STANDARD; 

    println!("String to base64 = {}", stringOfText.from_hex().from_utf8_owned().as_bytes().to_base64(config)); 

    // result should be: SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t 

} 

from_hex()

u8,의 버퍼를 기대 나에게 Vec<u8>.to_base64()을 제공 : 지금은 문자열로 표현되는 16 진수 값을 변환 찾고 있어요 버퍼를 얻으려면 as_bytes(), 아직까지 운이 없다.

+0

ToBase64'의 특성 '의 유일한 구현은'& [U8]'(HTTP ://doc.rust-lang.org/serialize/base64/trait.ToBase64.html),'to_base64()'를 사용하기 전에 그 번호를 변환해야합니다. – snf

+0

방금이 업데이트, @snf 감사'진수 = 0x49276d2하자,' 'U8로 정수 = 진수 지어다! ' 이'에 println ("진수 64 기수로 = {}", integer.to_base64 (구성)); ' 아직 행운이 없다. –

+0

내가 원하는 것을 얻지 못했다. base64_encode "0x49276d2"또는 "\ x04 \ x92 \ x76 \ xd2"또는 다른 것을 원하십니까? – snf

답변

3

다음 코드가 올바르게 BASE64

가 허용 응답으로 (rustc 1.3.0)와 동일한 결과를 얻었다 문자열을 인코딩 이제 2017이고 rustc-serialize는 이제 더 이상 사용되지 않습니다 (here 참조). 새로운 큰 직렬화 라이브러리는 serde라고 불립니다.하지만이 문제에 대해서는 약간 무겁습니다.

가 여기에 수동으로 Vec<u8>에 진수의 String에서 변환하는 빠른 해결책 다음으로 변환 this를 사용하는 base64 인코딩 String을.

저는이 루프가 16 진수 StringVec<u8>으로 변환하는 가장 좋은 해결책에 가깝다고 확신하지는 않지만 녹이기가 상당히 쉽습니다. 이것이 제가 가진 전부입니다. 댓글/개선을 부탁드립니다.

(이봐, 잠깐, 당신이 cryptopals을하고, 이러한 인코딩 된 문자열을 인식?)

extern crate base64; 
use std::u8; 
use self::base64::{encode}; 

pub fn hex_to_base64(hex: String) -> String { 

    // Make vector of bytes from octets 
    let mut bytes = Vec::new(); 
    for i in 0..(hex.len()/2) { 
     let res = u8::from_str_radix(&hex[2*i .. 2*i+2], 16); 
     match res { 
      Ok(v) => bytes.push(v), 
      Err(e) => println!("Problem with hex: {}", e), 
     }; 
    }; 

    encode(&bytes) // now convert from Vec<u8> to b64-encoded String 
}  
1

16 진수 값을 16 진수 값으로 변환하십시오 (16 진수 값과 같은 것은 없습니다 - 동일한 리터럴 숫자의 다른 형식 일뿐입니다). 당신이 int 값을 구성하는 바이트를 변환 할 것을 가정하면, 당신은 같은 것을 할 수 있습니다

extern crate serialize; 

use std::mem; 
use serialize::base64::{mod, ToBase64}; 

fn decompose_int(n: int, buf: &mut [u8]) { 
    assert!(mem::size_of::<int>() == buf.len()); 
    for i in range(0, buf.len()) { 
     buf[i] = ((n >> i*8) & 0xFF) as u8; 
    } 
} 

fn main() { 
    let mut bytes = [0u8, ..8]; 
    let x = 0x1122334455667788; 
    decompose_int(x, &mut bytes); 
    println!("{}", bytes.to_base64(base64::STANDARD)); 
} 

여기 decompose_int 기능은 작은 바이트의 조각 내로 int 값을 직렬화 (그것을 here 시도) 엔디안 형식. 그런 다음이 슬라이스는 평소대로 base64로 변환됩니다.

빅 엔디안 표현이 필요한 경우 buf[i]buf[buf.len()-1-i]으로 변경해야합니다. 업데이트 된 질문에 대한

+0

고맙습니다. :). 정확히, 녹스의 첫 단계를 만드는 방법을 이해하고 싶습니다. 귀하의 솔루션을 주셔서 감사합니다 그것은 확실히 0x 값 (작품 물어 봤는데.) 이제 16 진수 값을 나타 내기 위해 문자열을 사용하고 있는데, 바이트의 벡터로 변환해야합니다.). –

+0

당신은 매개 변수 - buf [i] ='를 수정하는 것이 좋은 생각이라고 생각하십니까? 대신 또 다른 변수'let buf1 = buf;가 있어야한다. buf1 [i] = ...' –

+0

@AlexanderSupertramp, 왜죠? 임시 변수에 대한 이유가 없습니다. –

4

,이 시도 :

extern crate "rustc-serialize" as serialize; 

use serialize::base64::{self, ToBase64}; 
use serialize::hex::FromHex; 

fn main() { 
    let input = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"; 
    let result = input.from_hex().unwrap().as_slice().to_base64(base64::STANDARD); 
    println!("{}", result); 
} 

(즉 직렬화 외부 상자에 지금 참고 rustc-serialize를 볼 감사 gsingh2011에..)

from_hex는 미개봉입니다 Result<Vec<u8>, FromHexError>을 반환 Vec<u8>으로 변경 한 다음 으로 &[u8]으로 사용합니다.

ResultOk 또는 Err 인 형식이며 일반적으로 결과를 계산하지 못하는 메서드에서 반환됩니다. 위의 경우 unwrapOk 값을 얻는 데 사용됩니다. 결과가 Ok이 아니면 실패합니다 (문자열에서 문자 중 하나를 제거하여 시도하십시오).

println!("{}", input.from_hex().unwrap_or(vec!()).as_slice().to_base64(base64::STANDARD)); 
: 당신은 그냥 기본값을 계속하려는 경우 또는, 당신은 unwrap_or을 사용할 수 있습니다

match input.from_hex() { 
    Ok(result) => println!("Yay: {}", result.as_slice().to_base64(base64::STANDARD)), 
    Err(error) => println!("Nay: {}", error) 
} 

: 프로그램이 무엇을하는지, 오류의 경우 일치를 사용하여 명시 적으로 처리되어야에 따라

다른 방법은 documentation for Result을 참조하십시오.

+0

Robinst 감사합니다!그래서 내가 올바르게 이해한다면, Rust 모범 사례는 실제 결과 (또는 오류의 경우 오류?)를 얻기 위해 unwrapped되어야하는 '패키지'내의 결과와 오류를 반환하는 것입니다. –

+1

예, 자세한 설명을 추가했습니다. 그 대답에. 다른 언어에서는 때때로이 예외 또는 여러 반환 값을 사용합니다. Rust에는 호출자가 한 가지 방법으로 처리 할 수있는 좋은 메소드가있는 유형이 있습니다. – robinst

+0

base64 변환 함수가 외부 상자 (https://github.com/rust-lang/rustc-serialize)로 이동했습니다. – gsingh2011

6

녹은 현재 진화하고 있으며, 허용 된 대답은 더 이상 제대로 작동하지 않습니다. 특히 extern crate 문은 인용 된 매개 변수를 허용하지 않으며 rustc-serialize 상자의 이름은 이제 rustc_serialize입니다.

extern crate rustc_serialize as serialize; 

use serialize::base64::{self, ToBase64}; 
use serialize::hex::FromHex; 

fn main() { 
    let input = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"; 
    let result = input.from_hex().unwrap().to_base64(base64::STANDARD); 
    println!("{}", result); 
} 

결과 :

SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t

관련 문제