2010-01-13 1 views
0

вот какой-то новый тестовый код в отношении моей длинной проблемы. Я полагаю, что если я буду кодировать мои вещи так долго, это половина битвы при портировании. , другая половина должна была бы превратить его в большой endian, чтобы он мог работать на любой 64-битной системе. так я сделал следующее:Почему stroull() не работает в массиве байтов с шестнадцатеричными значениями?

#include <iostream> 
#include "byteswap.h" 
#include "stdlib.h" 

using namespace std; 

int main() 

{ 

char bytes[6] = {0x12,0x23,0xff,0xed,0x22,0x34}; 


//long *p_long = reinterpret_cast<long*> (bytes); 


long long *p_long = reinterpret_cast<long long*> (bytes); 


std::cout<<"hex="<<std::hex<<*p_long<<"LE"<<std::endl; 


*p_long = bswap_64(*p_long); 


std::cout<<"hex="<<std::hex<<*p_long<<"BE"<<std::endl; 




return 0; 

} 

это мне кажется самым простым способом сделать это. Сейчас проблема заключается в использовании BSWAP ... я получаю следующие выходные данные

шестигранной = 34563422edff2312LE шестигранной = 0BE

я получил все байты в первой, как LE. но теперь кажется, что 64-битная функция обмена не работает. Я думаю, что это решит вопрос, который у меня есть.

Учитывая, что я буду работать с массивом по 20 байт. Я также не уверен, как использовать указатели для этого. Я думаю, что мне понадобится массив длинных указателей длин, чтобы получить все эти данные, а затем вызвать байты на каждом, чтобы поменять значения в каждом из этих указателей. Я лично не делал инкремент указателя через sizeof (long), чтобы увеличивать его раньше.

+0

я предполагаю, что я пытался взять байтовый массив, который имеет шестнадцатиричное значение, работающий в 32-битном окр к 64bit env. таким образом, это был один из способов изучения этой ситуации. , так что я думал, как это сделать. это пришло в голову. поэтому я тестировал его. типичный выходной байт выглядит так 22f6554c4341ef55c223d3d237f10cd0ff4ba48f положить, что в большой форме Endian и преобразования, что в десятичной системе, так что я может выводить х знаков после запятой из этой конечной продукции, что я пытаюсь сделать. – djones2010

+0

Байт-массив не имеет шестнадцатеричных значений. Байт-массив имеет байты (целочисленные значения). Вы инициализируете свой массив шестнадцатеричными целочисленными литералами, но это ничем не отличается от инициализации его с помощью '{171, 50, 84, 205, 68}'. Если вы пытаетесь преобразовать 32-разрядное целое число в 64-битное целое число, то вы можете просто использовать (возможно, маскирование или использование неподписанных типов, если вы не хотите расширения знака). – jamesdlin

ответ

0

Если вы ожидаете, что эта программа выведет «ab3254cd44», вы используете неправильную функцию. bytes не является строкой. Это всего лишь массив из 5 значений.

Попробуйте это:

int bytes[5] = {0xab,0x32,0x54,0xcd,0x44}; 
cout << hex; 
copy(&bytes[0], &bytes[sizeof(bytes)/sizeof(bytes[0])], ostream_iterator<int>(cout)); 

выходы программы:

ab3254cd44

5

Поскольку байты 0xab, 0x32,0x54,0xcd, 0x44 не представляют строку с завершающим нулевым символом, содержащую цифры ASCII, это то, что ожидает strtoll.

Что вы пытаетесь достичь? Если вы хотите, чтобы переосмысливать массив как долго долго, просто сделайте

signed long long test = *((signed long long *)bytes); 

(за исключением того, нужно добавить еще три байта, а также сделать весь массив 8-байтовый выровненный).

+0

Я думаю, я пытался взять массив байтов, который имеет шестнадцатеричные значения, работающие в 32-битном env до 64-битного env. таким образом, это был один из способов изучения этой ситуации. поэтому я думал, как это сделать. это пришло в голову. поэтому я тестировал его. типичный байтовый вывод выглядит так: 22f6554c4341ef55c223d3d237f10cd0ff4ba48f поместив его в большую форму и преобразуя его в десятичную, чтобы я мог выводить x десятичных знаков из этого финального вывода, это то, что я пытаюсь сделать. – djones2010

0

0xab не является допустимым шестнадцатеричным символом ASCII.

2

Это не сработало - оно сработало. Он преобразуется до первой цифры, которую он не может преобразовать, и код символа AB hex не является допустимой шестнадцатеричной цифрой.

0

strtoll преобразует cstring в целое число. байты не являются cstring, это массив из 5 байтов. Он возвращает 0, потому что первый байт не является шестнадцатеричным символом (от '1' до '0' или 'a' до 'f').

Компилятор обрабатывает все номера, которые вы даете ему, независимо от того, в какой базе они указаны, поэтому «байты» содержат {171, 50, 84, 205, 68}. Вам не нужно делать преобразование самостоятельно.

Смежные вопросы