2012-04-18 1 views
0

Azure (http://msdn.microsoft.com/en-us/library/dd135726.aspx)에 대한 base64 인코딩으로 작업하면 보이지 않습니다. 필요한 문자열을 다시 가져 오는 방법을 알아보십시오. C#에서 다음 작업을 수행 할 수 있습니다. (LINQPad에) 출력합니다Azure의 blobId에 대해 C++에서 int를 little-endian 형식의 바이트로 변환하십시오.

int blockId = 5000; 
var blockIdBytes = BitConverter.GetBytes(blockId); 
Console.WriteLine(blockIdBytes); 
string blockIdBase64 = Convert.ToBase64String(blockIdBytes); 
Console.WriteLine(blockIdBase64); 

: Qt는/C에서

Byte[] (4 items) 
| 136   | 
| 19   | 
| 0   | 
| 0   | 

iBMAAA== 

는 ++ 나는 그들 모두가 잘못된 값을 반환 몇 aporaches을 시도했다.

const int a = 5000; 
QByteArray b; 

for(int i = 0; i != sizeof(a); ++i) { 
    b.append((char)(a&(0xFF << i) >>i)); 
} 

qDebug() << b.toBase64(); // "iIiIiA==" 
qDebug() << QByteArray::number(a).toBase64(); // "NTAwMA==" 
qDebug() << QString::number(a).toUtf8().toBase64(); // "NTAwMA==" 

어떻게하면 C# 버전과 동일한 결과를 얻을 수 있습니까?

+2

'i'가 1 일 때 루프가하는 일을 생각해보십시오. 0xFF00을 원할 때 0xFF를 얻기 위해 0xFF를 1 비트 왼쪽으로 쉬프트합니다. –

+0

for-loop와 동일한 결과를 얻는 다른 방법이 있습니까? – chikuba

답변

0

는 나는이 다음과 같은 일을 결국 :

나는이 명확하다고 생각
QByteArray temp; 
int blockId = 5000; 

for(int i = 0; i != sizeof(blockId); i++) { 
    temp.append((char)(blockId >> (i * 8))); 
} 

qDebug() << temp.toBase64(); // "iBMAAA==" which is correct 
+0

David Schwartz가 한 것과 다른 결과를줍니다. 어느 것이 옳은가요? –

+0

이 코드는 C# 1과 동일한 결과를 제공하며 최소한 base 64로 인코딩 된 문자열은 동일하게 보입니다 – chikuba

+0

리틀 엔디안 형식으로 변환됩니다. 내 코드는 빅 엔디안 형식으로 변환됩니다. [docs] (http://msdn.microsoft.com/en-us/library/de8fssa4.aspx)는 원래 코드가 리틀 엔디안 형식을 사용한다고 말합니다. –

4

for 루프의 문제점에 대한 내 의견보기. 각 패스마다 1 비트 씩 이동하지만 실제로는 8 비트 여야합니다. 개인적으로, 나는 루프이 선호 : 위의

b.append(static_cast<char>(a >> 24)); 
    b.append(static_cast<char>((a >> 16) & 0xff)); 
    b.append(static_cast<char>((a >> 8) & 0xff)); 
    b.append(static_cast<char>(a & 0xff)); 

코드는 네트워크 표준 바이트 순서 (빅 엔디안)입니다. 리틀 엔디안 (little endian) 바이트 순서로 마지막에서 처음으로 네 가지 연산의 순서를 바꿉니다.

+0

첫 번째'append'에'& 0xFF'를하지 않은 이유가 있습니까? (나는 8 비트 바이트를 가진 기계에서 차이를 만들어 내지 않아도 모든 것을 다 수행 할 것이다.) –

+0

@JamesKanze 처음에는 필요하지 않지만 무해하다. 생성 된 코드가 정확히 같을 것으로 기대합니다. –

+0

8 비트 바이트가있는 컴퓨터를 사용하는 경우 필요하지 않습니다. 'a'는 서명 된 타입을 가지고 있기 때문에, 머신이 다른 크기의 바이트를 가지고 있다면 그것들 모두에 필요합니다. (물론,''128 ... 255 ''의 범위에서 값을 변환하는 것은 일반적인'char'가 8 비트로 서명되어 있다면 구현 정의됩니다. 실제로, –

-1

하지만 병이 스타일을 지정할 주장 할 수있다 ...

int i = 0x01020304; 
char (&bytes)[4] = (char (&)[4])i; 

와 직접 각 바이트에 액세스 할 수 있습니다 바이트 [0], 바이트 [1], ...로하고 당신이 그들과 함께하고 싶은 일을하십시오.

+0

나는 더 명확하게 알지 못한다. 그러나 작동하지 않는다. –

+0

나중에 "b.append (bytes [0])"할 수 있음을 의미합니다. 리틀 엔디안이면 0에서 3, 빅 엔디안이면 3에서 0입니다. 그것은 시프트 것보다 오류가 적고 바이트 순서에 집중할 수 있습니다. – BlueWanderer

+0

휴대용이 아닙니다. 'int'가 32 비트라고 가정하고, 2의 보수를 사용하지 않거나'int'에서 패딩 비트를 가진 몇몇 컴퓨터에서 완전히 실패합니다. 시프 팅은 정확히 무슨 일이 일어나고 있는지를 말합니다 : 바이트 n의 8 비트는 최종 int의 비트 'i ... j'입니다. –