2014-06-04 1 views
0

나는 전에 이것을 처리하지 않았다. 판매량 (48.58)을 4 바이트 배열로 변환하고 네트워크 바이트 순서를 사용해야합니다. 아래의 코드는 내가 어떻게하고 있는지를 보여 주지만 잘못된 것이며 왜 이해하지 못하고있다. 누구든지 도와 줄 수 있습니까?금액을 4 바이트 배열로 변환

float saleamount = 48.58F; 
byte[] data2 = BitConverter.GetBytes(saleamount).Reverse().ToArray(); 

배열에 66 66 81 236이 표시됩니다. 나는 그것이 무엇이되어야하는지 확신하지 못한다. 나는 신용 카드 단말기와 인터페이스를하고 "4 바이트, 고정 길이, 최대 값은 0xffffffff, 네트워크 바이트 순서 사용"으로 금액을 보내야합니다.

+1

"나는 그것이 무엇이되어야하는지 확신 할 수 없습니다."... 어떻게 그것이 잘못되었는지를 어떻게 알 수 있습니까? 나에게 꽤 합당한 것처럼 보입니다 :-) 또는 : 숫자를 나타내는 정수 (부동 소수점 값을 고정 된 고정 소수점 값으로 처리)가 필요합니까? – olydis

+1

또한 Reverse()를 사용하여 맹목적으로 BitConverter.IsLittleEndian을 먼저 확인하는 것이 좋습니다. – itsme86

+4

터미널에서 IEEE 싱글이 필요하다고 확신합니까? 신용 카드 단말기를 설계하고 있다면 해당 데이터 유형을 사용하지 않을 것입니다. – phoog

답변

0

질문해야 할 첫 번째 질문은 "어떤 데이터 형식입니까?"입니다. IEEE 단 정밀도 부동 소수점? 2의 보수 정수? 그것은 정수입니다. 함축 된 스케일은 무엇입니까? $ 48.53은 4,853 또는 485,300으로 표시됩니까?

금전적 가치가 +2 또는 +4의 내포 된 척도로 정수로 표시되는 것은 드문 일이 아닙니다. 귀하의 예에서 $ 48.58은 정수 값 4858 또는 0x000012FA으로 표시됩니다.

실제로 원하는 것을 설정했으면 엔디안 인식 BitConverter 또는 BinaryWriter를 사용하여 만듭니다. Jon Skeet's MiscUtil, 예를 들면 제공뿐만 아니라 거기에 다른 구현이있다

  • EndianBinaryReader
  • EndianBinaryWriter
  • BigEndianBitConverter
  • LittleEndianBitConverter

. 일부에 대한 링크는 See my answer의 질문에 "Helpful byte array extensions to handle BigEndian data"을 입력하십시오.

코드 코드를 작성하지 않아도 유지 관리 할 필요가 없습니다.

+0

나는 당신이 정확하다고 믿는다. 나는 값의 소수점을 사용하지 않고 테스트하는 중이다. 결과를 얻으면 업데이트 할 것입니다. – Kevin

+0

그건 그랬습니다! 소수점을 제거해야합니다. 고맙습니다. – Kevin

0

big-endian의 네트워크 바이트 순서 유사 동의어이므로 itsme86는 이미 언급) 그래서 당신은 BitConverter.IsLittleEndian을 확인할 수 있습니다

 float saleamount = 48.58F; 
     byte[] data2 = BitConverter.IsLittleEndian 
      ? BitConverter.GetBytes(saleamount).Reverse().ToArray() 
      : BitConverter.GetBytes(saleamount); 

을하지만 당신이 모르는 경우, 아마 당신은 이미 그것을 처리 할 몇 가지 프로토콜을 사용하여.

관련 문제